在Spring Test Framework Controller测试中获取表单参数的null

时间:2015-11-16 06:28:00

标签: java spring-mvc null form-submit spring-test-mvc

我正在使用Spring Test Framework测试注册表单提交。我使用param传递参数,但参数断言失败,因为值为null。以下是代码

控制器:

@RequestMapping("/signup")
public ModelAndView signUp(@ModelAttribute(value = "signupForm") @Valid SignupForm form, BindingResult bResult) {
    ModelAndView mv = new ModelAndView();
    if (bResult.hasErrors()) {
        mv.setViewName("signupform");
        return mv;
    }
    mv.setViewName("home");
    userService.sigUpUser(form);
    return mv;
}

提交的控制器测试:

@Test
public void goSignupFormSubmit() throws Exception {

    this.mockMvc.perform(post("/signup").contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .param("username", "somebody@gmail.com")
            .param("password", "somebody")
            .param("firstName", "somebody")
            .param("lastName", "kumar")
            ).andDo(print())
    .andExpect(status().isOk())
    .andExpect(view().name("home"))
    .andExpect(forwardedUrl("/WEB-INF/template/default.jsp"))
    .andExpect(model().attribute("username", is("somebody@gmail.com")))
    .andExpect(model().attribute("password", is("somebody")))
    .andExpect(model().attribute("firstName", is("somebody")))
    .andExpect(model().attribute("lastName", is("kumar")));

}

测试结果:

java.lang.AssertionError: Model attribute 'username'
Expected: is "somebody@gmail.com"
 got: null

at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:21)
at org.springframework.test.web.servlet.result.ModelResultMatchers$1.match(ModelResultMatchers.java:58)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:166)
at com.saffron.controller.FrontControllerIT.goSignupFormSubmit(FrontControllerIT.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:85)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:86)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:241)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Print()输出:

MockHttpServletRequest:
  HTTP Method = POST
  Request URI = /signup
   Parameters = {username=[somebody@gmail.com], password=[somebody], firstName=[somebody], lastName=[singh]}
      Headers = {Content-Type=[application/x-www-form-urlencoded]}

Handler:
         Type = com.saffron.controller.FrontController
       Method = public org.springframework.web.servlet.ModelAndView com.saffron.controller.FrontController.signUp(com.saffron.view.SignupForm,org.springframework.validation.BindingResult)

Async:
Async started = false
 Async result = null

Resolved Exception:
         Type = null

ModelAndView:
    View name = home
         View = null
    Attribute = signupForm
        value = signupForm [username=somebody@gmail.com, password=somebody, firstName=somebody, lastName=singh]
       errors = []

FlashMap:
   Attributes = null

MockHttpServletResponse:
       Status = 200
Error message = null
      Headers = {}
 Content type = null
         Body = 
Forwarded URL = /WEB-INF/template/default.jsp
Redirected URL = null
      Cookies = []

1 个答案:

答案 0 :(得分:1)

以下为我工作。下面是我的控制器的代码及其相应的控制器测试。希望能帮助到你。也不确定为什么这个问题被否决了。

控制器:

@RequestMapping("/signup")
public ModelAndView signUp(@ModelAttribute(value = "signupForm") @Valid SignupForm form, BindingResult bResult) {

    ModelAndView mv = new ModelAndView();
    if (bResult.hasErrors()) {
        mv.setViewName("signupform");
        return mv;
    }
    User user = userService.sigUpUser(form);
    mv.addObject("user", user);
    mv.setViewName("home");
    return mv;
}

检查表单提交:

@Test
public void goSignupFormSubmit() throws Exception {

    this.mockMvc
            .perform(post("/signup").contentType(MediaType.APPLICATION_FORM_URLENCODED)
                    .param("username", "somebody@gmail.com").param("password", "somebody")
                    .param("firstName", "somebody").param("lastName", "kumar"))
            .andDo(print()).andExpect(status().isOk()).andExpect(view().name("home"))
            .andExpect(forwardedUrl("/WEB-INF/template/default.jsp"))
            .andExpect(model().attribute("signupForm", hasProperty("username", is("somebody@gmail.com"))))
            .andExpect(model().attribute("signupForm", hasProperty("password", is("somebody"))))
            .andExpect(model().attribute("signupForm", hasProperty("firstName", is("somebody"))))
            .andExpect(model().attribute("signupForm", hasProperty("lastName", is("kumar"))));

}

检查数据库插入:

@Test
public void goSignupFormDatabaseInsertion() throws Exception {

    this.mockMvc
            .perform(post("/signup").contentType(MediaType.APPLICATION_FORM_URLENCODED)
                    .param("username", "somebody@gmail.com").param("password", "somebody")
                    .param("firstName", "somebody").param("lastName", "kumar"))
            .andExpect(status().isOk()).andExpect(view().name("home"))
            .andExpect(forwardedUrl("/WEB-INF/template/default.jsp"))
            .andExpect(model().attribute("user", hasProperty("username", is("somebody@gmail.com"))))
            .andExpect(model().attribute("user", hasProperty("password", is("somebody"))))
            .andExpect(model().attribute("user", hasProperty("enabled", is(1))))
            .andExpect(model().attribute("user", hasProperty("authority", hasProperty("username", is("somebody@gmail.com")))))
            .andExpect(model().attribute("user", hasProperty("authority", hasProperty("authorityType", is("candidate")))))
            .andExpect(model().attribute("user", hasProperty("userDetails", hasProperty("username", is("somebody@gmail.com")))))
            .andExpect(model().attribute("user", hasProperty("userDetails", hasProperty("firstName", is("somebody")))))
            .andExpect(model().attribute("user", hasProperty("userDetails", hasProperty("lastName", is("kumar")))));

}