Java Spring Boot仅在单元测试中返回错误的状态代码
我正在用Spring Boot开发一个RESTAPI 我有一个控制器来创建一个新用户,当用户被创建时,它用201(CREATED)响应。响应没有正文内容 通过邮递员或任何浏览器,我得到了201的回复。 但是当我尝试使用单元测试(Mockito)时,响应是200 这是我的密码: 控制器:Java Spring Boot仅在单元测试中返回错误的状态代码,java,spring,unit-testing,Java,Spring,Unit Testing,我正在用Spring Boot开发一个RESTAPI 我有一个控制器来创建一个新用户,当用户被创建时,它用201(CREATED)响应。响应没有正文内容 通过邮递员或任何浏览器,我得到了201的回复。 但是当我尝试使用单元测试(Mockito)时,响应是200 这是我的密码: 控制器: public CompletableFuture<ResponseEntity<Void>> registerNewUser( @RequestBody @Valid Regist
public CompletableFuture<ResponseEntity<Void>> registerNewUser(
@RequestBody @Valid RegisterUserDto newUser
) throws ExecutionException, InterruptedException {
// user service return a completable future void
return userService.registerNewUser(newUser).thenApply(u -> new ResponseEntity<>(u, HttpStatus.CREATED));
}
TestHelpers.convertToJson和TestHelpers.getJsonMediaType是静态方法
public static MediaType getJsonMediaType() {
return new MediaType(MediaType.APPLICATION_JSON.getType(),
MediaType.APPLICATION_JSON.getSubtype(),
Charset.forName("utf8"));
}
public static String convertToJson(Object o) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(o);
}
我不明白为什么单元测试的响应代码是200。在控制器、服务或控制器建议的任何部分,我都有一个200 OK的响应。问题是因为我的控制器和服务是异步的,所以我的单元测试没有等待正确的响应 将我的单元测试更改为:
MvcResult result = mvc.perform(post("/api/users/new")
.content(TestHelpers.convertToJson(registroMock))
.contentType(TestHelpers.getJsonMediaType()))
.andReturn();
mvc.perform(asyncDispatch(result))
.andExpect(status().isCreated());
默认情况下,Spring控制器返回HTTP200OK,所以您的测试用例是正确的。我明白了!tks@mrkernelpanic。因为我的控制器和服务是异步的,所以我的单元测试没有等待响应,这就是为什么我得到了200。改变了我的单元测试,现在一切正常(我将更新我的问题),我甚至不能告诉你们,你们在初始问题和解决方案中的代码方法为我节省了多少时间。感谢谢林戈布里加多·罗伯托!节省了我很多时间。关于异步(deferredResult/CompletableFuture)的IT测试似乎没有很好的文档记录。
public static MediaType getJsonMediaType() {
return new MediaType(MediaType.APPLICATION_JSON.getType(),
MediaType.APPLICATION_JSON.getSubtype(),
Charset.forName("utf8"));
}
public static String convertToJson(Object o) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(o);
}
MvcResult result = mvc.perform(post("/api/users/new")
.content(TestHelpers.convertToJson(registroMock))
.contentType(TestHelpers.getJsonMediaType()))
.andReturn();
mvc.perform(asyncDispatch(result))
.andExpect(status().isCreated());