【问题标题】:Spring Mockmvc ignores unknown fieldsSpring Mockmvc 忽略未知字段
【发布时间】:2021-12-11 03:54:13
【问题描述】:

API 方法已经通过@Valid 注解进行了验证。当我使用邮递员测试此方法并发布未知字段时,它可以工作并拒绝请求。但是,当我使用 mockMvc 进行测试时,mockMvc 会忽略未知字段。知道如何强制 mockMvc 考虑 API 方法中的验证。

控制器

@PostMapping(value = "/path", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> notification(@Valid @RequestBody RequestClass requestPayload) {

}

测试方法

MockHttpServletRequestBuilder builder = MockMvcRequestBuilders
                .post("/path" )
                
                .content("{\"fakeField\":\"fake\",\"userId\":\"clientId\"")
                .contentType(MediaType.APPLICATION_JSON_VALUE);

        String responseMessage = "Error message";

        this.mockMvc =
                standaloneSetup(myController)
                .build();

        this.mockMvc
                .perform(builder)
                .andDo(print())
                .andExpect(status().is(HttpStatus.BAD_REQUEST.value()))
                .andExpect(content().string(containsString(responseMessage)));

【问题讨论】:

  • 问题是为什么您在生产代码中将FAIL_ON_UNKNOWN_PROPERTIES 设置为true,并在测试中设置为false。这归结为一个问题:您是如何配置 ObjectMapper 的?

标签: mockito spring-test-mvc


【解决方案1】:

检查未知字段并返回 400 (BAD_RQUEST) 是 Jackson 的反序列化功能 (ObjectMapper)。它不是由 Java 的 Bean Validation 处理的。

使用您的自定义 MockMvc 独立设置,您可以选择退出默认 Spring Boot 自动配置,该自动配置将根据您配置的功能配置 ObjectMapper

我建议使用@WebMvcTest(YourController.class) for your controller tests 然后注入自动配置的MockMvc

@WebMvcTest(YourController.class) // auto-configures everything in the background for your, including the ObjectMapper
class YourControllerTest {

  @Autowired
  private MockMvc mockMvc;


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多