我正在使用 Spring Boot 开发 REST API。
我有一个控制器来创建一个新用户,当创建用户时它会响应 201 (CREATED)。响应没有正文内容。
使用 Postman 或任何浏览器,我收到 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));
}
当注册过程完成时,用户服务返回一个可完成的未来无效。
@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。在我的控制器、服务或控制器建议的任何部分中,我都会收到响应 200 OK。