【问题标题】:How do i mock the behavior of a void method when unit testing my delete service?在对删除服务进行单元测试时,如何模拟 void 方法的行为?
【发布时间】: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


【解决方案1】:

WebMVC 测试层未配置为包含被测控制器; DeleteUserController。 404 指的是缺少请求映射,而不是未找到功能用户。使用@WebMvcTest(DeleteUserController.class) 而不是@WebMvcTest(DeleteUserService.class)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 2013-02-21
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多