65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2017年5月16日

CPOL

2分钟阅读

viewsIcon

8942

这是一个用于 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 容器中。

© . All rights reserved.