gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:44:06 25 4
gpt4 key购买 nike

我用 @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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com