【发布时间】:2020-06-19 16:06:48
【问题描述】:
我目前正在对 Spring Boot CRUD RESTful API 的端点进行单元测试,并且我有以下 "Delete user by its id" 端点,它由 控制器 组成和一个服务来实现它的逻辑:
删除控制器(主要是调用服务的逻辑和定义一些指引):
@RestController
@RequestMapping("/users/{id}")
public class DeleteUserController {
@Autowired
DeleteUserService service;
@DeleteMapping
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteUser_whenDeleteUser(@PathVariable Long id) {
service.deleteUser(id);
}
}
删除服务:
@Service
public class DeleteUserService {
@Autowired
UserRepository repository;
public void deleteUser(Long id) {
repository.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));
repository.deleteById(id);
}
}
虽然到目前为止一切似乎都运行良好,但如果有人能告诉我我可以在上面的代码中改进什么,我将不胜感激。无论如何,我的控制器单元测试是我似乎无法解决的问题:
@RunWith(SpringRunner.class)
@WebMvcTest(DeleteUserService.class)
public class DeleteUserControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private DeleteUserService deleteUserService;
@Test
public void removeUserById_whenDeleteMethod() throws Exception {
User user = new User();
user.setName("Test Name");
user.setId(89L);
doNothing().when(deleteUserService).deleteUser(user.getId());
mvc.perform(delete("/users/" + user.getId().toString())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNoContent());
}
我收到 java.lang.AssertionError: Status 是因为代码预期会收到 204 No content 响应状态,它正在接收 404 Not found,这意味着它正在抛出当用户不存在时应该抛出的异常。
我认为答案是我需要模拟我的服务逻辑的行为,但我不知道如何。如果有人可以帮助我解决这个问题,将不胜感激。
【问题讨论】:
-
您要删除的用户是否存在?我看到您创建了一个用户,但该用户需要在存储库中,否则它只是一个本地
User除了该方法之外没有任何地方存在。
标签: java spring unit-testing junit mocking