天天看点

Spring MVC 测试 | 模拟提交表单

在 Spring 4 MVC 单元测试例子 一文中利用Spring test 框架进行了简单的测试,代码

mockMvc.perform(get("/SayHello/getAnswer"))

使用

get()

方法发送了一个GET请求。

现在需求变了,需要提交一个表单,该如何实现?

首先,要测试下面这样一个方法:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(method = RequestMethod.POST)
    @ResponseStatus( HttpStatus.CREATED )
    public void addUser(@Validated User user,
            BindingResult result,
            HttpServletResponse response) throws BindException{

        //省去代码
    }

}
           

注意它要接收一个User类对象作为参数,User类如下:

@Component
public class User {
   private long id;
   private String name;

   //省去getter和setter
}
           

模拟请求中要如何携带这样的参数呢?是创建一个User对象,添加到请求中吗?实际,测试类应该这样编写:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations={"classpath:spring-servlet.xml","classpath:applicationContext.xml"})
public class UserControllerTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void Setup(){
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testAddUser() throws Exception {    
        mockMvc.perform(post("/user").param("id", "1")) //注意这行
        .andDo(print())
        .andExpect(status().is())
        .andExpect(redirectedUrl("/user/1"));
    }

}
           

从上面的代码中可以看出,

post()

方法可以像

post("/user").param("id", "1")

这样加入表单参数,要加多个参数,

post()

方法后面就可以加多个

param()

方法。只要

param()

方法添加的参数的名字和User类的属性名字相同即可。

  1. 这里使用的Spring框架版本号是4.2.4,3.x版本的测试可能与这个有所差别。
  2. 国外有网友也有遇到同样的问题,贴出实例代码,可以参看:Set @ModelAttribute in MockHttpServletRequest in JUnit Test