春季测试mockMvc忽略验证

时间:2018-08-23 09:06:28

标签: validation spring-mvc spring-test mockmvc

请帮助我解决以下问题: 我有一堂课,其中几个字段被标记为@NotNull:

public class SearchCommentRequest {

@NotNull
private Date fromDate;

@NotNull
private Date toDate;

//...
}

如果将此类作为@RequestBody传递给控制器​​(也用@Valid注释)则为对象:

@PostMapping(value = "/comment/search", consumes="application/json", produces = "text/csv")
public ResponseEntity<byte[]> searchComments(@RequestBody @Valid SearchCommentRequest searchRequest) {
    List<SearchCommentResult> comments = commentService.searchComments(searchRequest);

所以,我希望fromDate或toDate中的任何一个为空-都会引发异常。

在编写集成测试时,我还决定检查此验证案例:

@Test
public void searchCommentsValidateRequest() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    SearchCommentRequest request = new SearchCommentRequest();
    // toDate = null; 
    request.setFromDate(new Date());
    String requestBody = mapper.writer().writeValueAsString(request);

    mockMvc.perform(post(COMMENT_SEARCH_ENDPOINT)
            .contentType("application/json")
            .content(requestBody))
            .andDo(MockMvcResultHandlers.print())
            .andExpect(status().is(400));
}

但是,看起来mockMvc忽略了验证。在搜索相同的问题时,我找到了解决方案添加以下依赖项的多个来源:

 <dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
    <scope>test</scope>
 </dependency>

<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.el</artifactId>
   <version>3.0.0</version>
</dependency>

但这没有帮助。 我正在使用Spring 4.3.3.RELEASE,并手动将以下依赖项添加到pom.xml中:

<dependency>
   <groupId>javax.validation</groupId>
   <artifactId>validation-api</artifactId>
   <version>2.0.1.Final</version>
</dependency>

1 个答案:

答案 0 :(得分:0)

实际上,@ Notnull通常在实体级别使用。 当您自动保留实体时,它将验证并引发异常。

如果要在控制器上验证并使用@Valid。

您应该声明有关BindingResult结果的更多信息

并检查错误

if(result.hasErrors()){
//do something or throw exceptions
}