如何使用@PathVariable对Spring MVC控制器进行单元测试?

我有一个与此类似的简单带注释的控制器:

@Controller

public class MyController {

@RequestMapping("/{id}.html")

public String doSomething(@PathVariable String id, Model model) {

// do something

return "view";

}

}

我想用这样的单元测试来测试它:

public class MyControllerTest {

@Test

public void test() {

MockHttpServletRequest request = new MockHttpServletRequest();

request.setRequestURI("/test.html");

new AnnotationMethodHandlerAdapter()

.handle(request, new MockHttpServletResponse(), new MyController());

// assert something

}

}

问题是AnnotationMethodHandlerAdapter.handler()方法引发异常:

java.lang.IllegalStateException: Could not find @PathVariable [id] in @RequestMapping

at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.resolvePathVariable(AnnotationMethodHandlerAdapter.java:642)

at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolvePathVariable(HandlerMethodInvoker.java:514)

at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:262)

at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:146)

回答:

从Spring 3.2开始,有一种合适的方法可以轻松,优雅地进行测试。你将可以执行以下操作:

@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"));

}

}

以上是 如何使用@PathVariable对Spring MVC控制器进行单元测试? 的全部内容, 来源链接: utcz.com/qa/427523.html

回到顶部