Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot仅在单元测试中返回错误的状态代码_Java_Spring_Unit Testing - Fatal编程技术网

Java Spring Boot仅在单元测试中返回错误的状态代码

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

我正在用Spring Boot开发一个RESTAPI

我有一个控制器来创建一个新用户,当用户被创建时,它用201(CREATED)响应。响应没有正文内容

通过邮递员或任何浏览器,我得到了201的回复。 但是当我尝试使用单元测试(Mockito)时,响应是200

这是我的密码:

控制器

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());