使用MockMVC测试Spring MVC路由器

我正在尝试使用Spring测试来测试我的Spring MVC Web应用程序。它使用springmvc-

router进行路由,这似乎破坏了测试,当我使用@RequestMapping而不是routes.conf文件时,该测试工作正常。

我有一个.jsp名为的文件valid.jsp,当我从Jetty运行开发站点时,它显示正常。控制器是:

@Controller

@EnableWebMvc

public class AuthController {

public String valid() {

return "valid";

}

}

我的routes.conf文件映射GET /valid authController.valid

现在,我的测试仪看起来像

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {"/test-context.xml",

"/spring/spring-security.xml",

"file:src/main/webapp/WEB-INF/mvc-config.xml"})

@WebAppConfiguration

@Import(RouteConfig.class)

public class AuthControllerTest {

private MockMvc mockMvc;

@Autowired

private WebApplicationContext webApplicationContext;

@Autowired

private AuthenticationManager authenticationManager;

@Before

public void init() {

MockitoAnnotations.initMocks(this);

mockMvc =

MockMvcBuilders.webAppContextSetup(webApplicationContext).dispatchOptions(true).build();

}

@Test

public void testValid() throws Exception {

mockMvc.perform(get("/validation-success"))

.andDo(print())

.andExpect(status().isOk());

}

mockMvc.perform()运行时,则抛出NullPointerException:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:943)

at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)

at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:64)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)

at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:170)

at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:137)

at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:141)

at com.mypackage.AuthControllerTest.testValid(AuthControllerTest.java:45)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)

at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)

at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)

at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)

at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)

at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)

at org.junit.runners.ParentRunner.run(ParentRunner.java:309)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)

at org.junit.runner.JUnitCore.run(JUnitCore.java:160)

at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)

at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)

at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Caused by: java.lang.NullPointerException

at org.resthub.web.springmvc.router.HTTPRequestAdapter.parseRequest(HTTPRequestAdapter.java:196)

at org.resthub.web.springmvc.router.RouterHandlerMapping.getHandlerInternal(RouterHandlerMapping.java:166)

at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:300)

at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1101)

at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java:104)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:916)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)

... 41 more

因此问题是:是否可以将Spring的测试框架与springmvc-router一起使用?

回答:

进行一些挖掘之后,我发现该HTTPRequestAdapter.parseRequest()方法与MockMVC发送请求的方式有关。具体来说,由MockMVC发送的请求在请求中的名称中不包含标头host

HTTPRequestAdapter需要该标头,并且不考虑它可以为null的事实,因此它生成NullPointerException

我用以下代码解决了这个问题:

mockMvc.perform(get("/validation-success")

.header("host", "localhost:80"))

.andExpect(status().isOk());

host头将不为空,你的测试应该通过。

以上是 使用MockMVC测试Spring MVC路由器 的全部内容, 来源链接: utcz.com/qa/409351.html

回到顶部