java - 在独立 MockMvc 中测试 @Validated RestController 不起作用

标签 java spring spring-boot spring-web spring-validator

我用 @Validated 注释了 RestController,用于验证路径变量/请求参数:

@RestController
@Validated
public class MainController implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    private CarsService carsService;

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void handleException(ConstraintViolationException ex) {}

    @GetMapping(
            value = "/",
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> getCars(
            @RequestParam(value = "offset", defaultValue = "0") @PositiveOrZero
                    Integer offset,
            @RequestParam(value = "limit", defaultValue = paginationLimitDefault)
            @Positive @Max(paginationLimitMax)
                    Integer limit) {
        ...
        ...
        Map responseBody = new HashMap<String, Object>();
        responseBody.put("offset", offset);
        responseBody.put("limit", limit);
        return ResponseEntity.status(HttpStatus.OK).body(responseBody);
    }
}

现在,我想使用独立的 mockMvc 对 Controller 级别进行单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class TestMainController {

    @InjectMocks
    private MainController mainController;

    @Mock
    private CarsService carsServiceMock;

    private MockMvc mockMvc;

    @Before
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(mainController).build();
    }

    @Test
    public void getCarsInvalidOffset() throws Exception {
        mockMvc.perform(get("/")
                .param("offset", "-1"))
                .andExpect(status().isBadRequest());
    }

    @Test
    public void getCarsInvalidLimit() throws Exception {
        mockMvc.perform(get("/")
                .param("limit", "0"))
                .andExpect(status().isBadRequest());
        mockMvc.perform(get("/")
                .param("limit", "-1"))
                .andExpect(status().isBadRequest());
        mockMvc.perform(get("/")
                .param("limit", "101"))
                .andExpect(status().isBadRequest());
    }
}   

问题是使用无效参数的测试(上面代码片段中的两个测试)应该返回错误的请求,实际上返回 200 OK,因此测试失败。
我该如何修复它? 谢谢。

最佳答案

这对于standaloneSetup来说是不可能的。

更多详情请参阅:How to enable controller parameter validation for standalone MockMvc

对于@Validated 测试用例,我们需要:

MockMvcBuilders.webAppContextSetup() 

关于java - 在独立 MockMvc 中测试 @Validated RestController 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55136839/

相关文章:

java - 如何使用 Java 将 "2012-03-04 00:00:00.0"转换为格式为 "dd-mm-yyyy HH:mm:ss"的日期

java - 如何清理四叉树的边缘?

java - 存储库找到 3 条记录,结果列表返回 6 条记录

Spring Boot/Kafka Json 反序列化 - 可信包

Spring Boot starter 社交 Facebook 添加权限

java - Springboot测试在Junit 5中加载ApplicationContext失败

java - 为什么我在使用 Spring Data JPA 的 Spring Boot 项目中获取此 "org.hibernate.exception.SQLGrammarException"?

java - 如何配置 Kafka 使其表现得像一个 FiFo 队列?

java - 如何将 Spring Boot @RepositoryRestResource 映射到特定的 url?

java - 使用 Selenium 找出选择了哪个单选按钮(实现为 li)