How to unit test a Spring MVC controller using @PathVariable? How to unit test a Spring MVC controller using @PathVariable? spring spring

How to unit test a Spring MVC controller using @PathVariable?


I'd call what you're after an integration test based on the terminology in the Spring reference manual. How about doing something like:

import static org.springframework.test.web.ModelAndViewAssert.*;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration({/* include live config here    e.g. "file:web/WEB-INF/application-context.xml",    "file:web/WEB-INF/dispatcher-servlet.xml" */})public class MyControllerIntegrationTest {    @Inject    private ApplicationContext applicationContext;    private MockHttpServletRequest request;    private MockHttpServletResponse response;    private HandlerAdapter handlerAdapter;    private MyController controller;    @Before    public void setUp() {       request = new MockHttpServletRequest();       response = new MockHttpServletResponse();       handlerAdapter = applicationContext.getBean(HandlerAdapter.class);       // I could get the controller from the context here       controller = new MyController();    }    @Test    public void testDoSomething() throws Exception {       request.setRequestURI("/test.html");       final ModelAndView mav = handlerAdapter.handle(request, response,            controller);       assertViewName(mav, "view");       // assert something    }}

For more information I've written a blog entry about integration testing Spring MVC annotations.


As of Spring 3.2, there is a proper way to test this, in an elegant and easy way. You will be able to do things like this:

@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration("servlet-context.xml")public class SampleTests {  @Autowired  private WebApplicationContext wac;  private MockMvc mockMvc;  @Before  public void setup() {    this.mockMvc = webAppContextSetup(this.wac).build();  }  @Test  public void getFoo() throws Exception {    this.mockMvc.perform(get("/foo").accept("application/json"))        .andExpect(status().isOk())        .andExpect(content().mimeType("application/json"))        .andExpect(jsonPath("$.name").value("Lee"));  }}

For further information, take a look at http://blog.springsource.org/2012/11/12/spring-framework-3-2-rc1-spring-mvc-test-framework/