用于 Spring MockMvcRequestBuilder 轻松发布表单对象的工具





4.00/5 (1投票)
这是一个用于 Spring MockMvcRequestBuilder 的工具,用于发布表单对象。
阅读时间:2 分钟
使用工具测试 Spring MVC 表单验证,用于 MockMvcRequestBuilder
Spring MVC 测试框架非常适合在无需运行 Servlet 容器的情况下测试控制器。但是,处理表单验证并不总是直接的,尤其是在表单有很多属性时。本文将展示如何使用一个允许 MockMvcRequestBuilder
将整个表单对象发布到控制器的工具,轻松地测试表单验证。
使用 @Valid 注解验证表单
关于 Spring MVC 中 JSR-303 支持的快速回顾。
@Valid
注解告诉 Spring MVC 在收到请求后触发对已注释 bean 的验证
@PostMapping("/add")
public String addUser(@Valid AddUserForm addUserForm,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
if (bindingResult.hasErrors()) {
return ADD_USER_VIEW;
} else {
// Save new user
redirectAttributes.addFlashAttribute("flash", "User added");
return "redirect:" + ADD_USER_URL;
}
}
public class AddUserForm {
@NotNull
@Size(min = 1)
private List firstNames;
@NotNull
@Size(min = 3)
private String name;
@NotNull
private LocalDate birthDate;
@NotNull
@Valid
private Address address;
@NotNull
@Size(min = 1)
private String[] hobbies;
@NotNull
private Gender gender;
}
使用 MockMvc 提交表单对象
虽然 MockMvc
是一个有用的工具,但处理大型表单提交时并不方便。要测试包含大量字段的表单,您必须将每个字段映射到 HTTP 参数,如下所示
this.mockMvc.perform(MockMvcRequestBuilders.post("url")
.param("field", "fieldValue")
.param("field2.nestedField", "nestedFieldValue")
如果表单不包含太多字段(或嵌套字段!),可以使用此方法。但是,如果需要测试多个表单验证,这会使事情变得更加复杂,因为它容易出错(字段名称、缺少字段等),并且也比较重复。
因此,我为 MockMVCRequestBuilder
构建了一个工具 (https://github.com/f-lopes/spring-mvc-test-utils)。
注意:更好的方法是减少表单中的字段数量。如果由于某种原因无法做到,您仍然可以使用此工具。
使用自定义 MockMvcRequestBuilder 发送表单对象
此工具允许使用 MockMvcRequestBuilder
发送整个表单对象。
使用方法很简单
final AddUserForm addUserForm = new AddUserForm
(Arrays.asList("John", "Jack"),
"Doe", LocalDate.now(), new Address(1, "Amber", "New York"));
this.mockMvc.perform(MockMvcRequestBuilderUtils.postForm("/users/add", addUserForm))
.andExpect(MockMvcResultMatchers.model().attributeErrorCount("addUserForm", 1));
此构建器使用反射查找字段,并将它们作为 HTTP 参数传递给请求
firstNames[0]=John
firstNames[1]=Jack
lastName=Doe
address.streetNumber=1
address.street=Amber
address.city=New York
它还支持属性编辑器,以便以您想要的方式格式化字段
MockMvcRequestBuilderUtils.registerPropertyEditor
(LocalDate.class, new CustomLocalDatePropertyEditor("dd/mm/yyyy");
获取该工具
将这些行添加到您的 pom.xml
<dependency>
<groupId>io.florianlopes</groupId>
<artifactId>spring-mvc-test-utils</artifactId>
<version>1.0.0</version>
</dependency>
有关更多信息,请参阅文档:https://github.com/f-lopes/spring-mvc-test-utils。
此帖子的示例代码可在 https://github.com/f-lopes/spring-mvc-form-validation-tests 处获得。
文章 一个用于 Spring MockMvcRequestBuilder 的工具,可以轻松地发布表单对象 最初发表在 Florian Lopes 的博客上,该博客运行在 Docker 容器中。。