gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:05 24 4
gpt4 key购买 nike

我正在使用 Spring Boot 开发 REST API。

我有一个 Controller 来创建一个新用户,它在创建用户时以 201 (CREATED) 响应。响应没有正文内容。

使用 Postman 或任何浏览器,我收到了 201 响应。但是当我尝试使用单元测试 (Mockito) 时,响应是 200。

这是我的代码:

Controller :

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

当注册过程完成时,用户服务返回一个可完成的 future void。

@Async
CompletableFuture<Void> registerNewUser(NewUserDto newUserDto) throws ExecutionException, InterruptedException;

然后,在我的单元测试中,我有以下代码:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UsersControllerTest {

@Autowired
private MockMvc mvc;

@Mock
private UsersService userService;

@InjectMocks
private UsersControllers usersController;

@Before
public void init() {
MockitoAnnotations.initMocks(this);
this.mvc = MockMvcBuilders.standaloneSetup(usersController).build();
}

@Test
public void mustCreateANewUser() throws Exception {
NewUserDto userMock = new NewUserDto("firstname", "lastname", "login", "password");

when(userService.registerNewUser(any(NewUserDto.class)))
.thenReturn(CompletableFuture.completedFuture(null));

mvc.perform(post("/api/users/new")
.content(TestHelpers.convertToJson(userMock))
.contentType(TestHelpers.getJsonMediaType()))
.andExpect(status().isCreated());
}
}

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。在我的 Controller 、服务或 Controller 建议的任何部分,我都有一个响应 200 OK。

最佳答案

问题是因为我的 Controller 和服务是异步的,所以我的单元测试没有等待正确的响应。

将我的单元测试更改为:

MvcResult result = mvc.perform(post("/api/users/new")
.content(TestHelpers.convertToJson(registroMock))
.contentType(TestHelpers.getJsonMediaType()))
.andReturn();

mvc.perform(asyncDispatch(result))
.andExpect(status().isCreated());

关于java - Spring Boot 仅在单元测试中返回错误的状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46908906/

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