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