Spring MVC JUnit And Mockito Configuration
08-02-2016
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/applicationContext.xml",
"classpath:/mvc-dispatcher-servlet.xml",
"classpath:/spring-security.xml"})
@WebAppConfiguration
public class SimpleTest {
@Autowired
WebApplicationContext wac;
@Autowired
private UserService userService;
private MockMvc mockMvc;
@Before
public void setup(){
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void testtWelcomePage() throws Exception {
ModelAndView modelAndView = mockMvc.perform(get("/admin"))
.andExpect(status().isOk())
.andReturn()
.getModelAndView();
assertEquals("admin/index", modelAndView.getViewName());
}
@Test
public void getAllUsers() {
User user = userService.getUser("codesenior");
assertNotNull(user);
}
}
At line 1, We should use SpringJUnit4ClassRunner class, not MockitoJUnitRunner class, but if you want to use both of them, you should define @RunWith(SpringJUnit4ClassRunner.class) and add MockitoAnnotations.initMocks(this) in setup method annotated with @Before. Because we can't use multiple @RunWith annotation, we choosed to replace @RunWith(MockitoJUnitRunner.class) with MockitoAnnotations.initMocks(this)
At line 2 and 3, we configured Spring application. Notice that there are three xml configuration file are used. If you are developing wep application, these files most probably located in the WEB-INF directory. Add below configuration into the maven pom.xml file, then Maven will automatically add WEB-INF directory into the classpath:
<build>
<testResources>
<testResource>
<directory>src/main/webapp/WEB-INF</directory>
</testResource>
</testResources>
</build>
Mockito library provides us MockMvc class to emulate GET, POST, etc. HTTP requests, so we have to initialize this class in setup() method as above.
At line 31, we called UserService's getUser() method.
Now, lets look at Maven dependencies:
<properties>
<spring.test>4.1.4.RELEASE</spring.test>
<junit.version>4.12</junit.version>
<hamcrest.version>1.3</hamcrest.version>
<mockito.all>2.0.2-beta</mockito.all>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.test}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>${mockito.all}</version>
<scope>test</scope>
</dependency>
</dependencies>
If you want to use Mockito standalone configuration, you can look at this article: http://www.codesenior.com/en/tutorial/Spring-MVC-JUnit-Mock-Standalone-Configuration