Firstly I add to the pom file the Spring test dependency:
<properties>
<!-- ... -->
<spring-test.version>4.3.0.RELEASE</spring-test.version>
<!-- ... -->
</properties>
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-test.version}</version>
<scope>test</scope>
</dependency>
<!-- ... -->
</dependencies>
Then I write a JUnit tester for my HomeController, following a simple pattern:@Test
public void testHome() {
HomeController controller = new HomeController(); // 1
try {
MockMvc mockMvc = standaloneSetup(controller).build(); // 2
mockMvc.perform(get("/")).andExpect(view().name("home")); // 3
} catch(Throwable t) { // 4
// ...
}
}
1. I create an object from my controller.2. I build a mock MVC test object from my controller.
3. I perform a mock HTTP GET command for "/" and verify I get back a view named "home".
4. There is not much control on what a MockMvc would throw in case something goes wrong, we have to be ready to catch any possible throwable.
It looks very clean and simple. However I had a problem in the form of this exception:
java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig at org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder. initWebAppContext(StandaloneMockMvcBuilder.java:329) ...The fact is that I specified in the POM a dependency for the ancient javax.servlet servlet-api 2.5, while I should use at least a version 3 to get the job done. For my purposes, 3.1.0 is more than enough.
Pay attention to the artifact name change that happened right at the time of moving from 2 to 3. Now the servlet api is identified by the id javax.servlet-api.
Let's slightly improve my web app. We want now that the controller returns the home view while getting both root and "/homepage".
I add another test case, testHomeExtra(), that is just like testHome() but it performs a GET on the other URI.
As expected, it fails, giving as reason, "No ModelAndView found".
I change my controller, specifying at class level which URI's it has to manage:
@Controller
@RequestMapping({"/", "/homepage"})
public class HomeController {
@RequestMapping(method = GET)
public String home(Model model) {
return "home";
}
}
And now I have green light while testing.Reference: Building Spring web applications, from Spring in Action, Fourth Edition by Craig Walls. Chapter five, section two, Testing the controller.
I have committed the project changes to GitHub.

No comments:
Post a Comment