Java 在对删除服务进行单元测试时,如何模拟void方法的行为?

Java 在对删除服务进行单元测试时,如何模拟void方法的行为?,java,spring,unit-testing,junit,mocking,Java,Spring,Unit Testing,Junit,Mocking,我目前正在对Spring Boot CRUD RESTful API的端点进行单元测试,我有以下“按id删除用户”端点,该端点由一个控制器和一个服务组成,以实现其逻辑: Delete controller(它主要调用服务的逻辑并定义一些准则): 删除服务: @Service public class DeleteUserService { @Autowired UserRepository repository; public void deleteUser(Long

我目前正在对Spring Boot CRUD RESTful API的端点进行单元测试,我有以下“按id删除用户”端点,该端点由一个控制器和一个服务组成,以实现其逻辑:

Delete controller(它主要调用服务的逻辑并定义一些准则):

删除服务:

@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无内容响应状态,但它接收到一个404 Not found,这意味着它正在抛出当用户不存在时应该抛出的异常


我认为答案在于我需要模仿我的服务逻辑的行为,但我不知道如何。如果有人能帮我解决这个问题,我将不胜感激。

WebMVC测试层未配置为包含被测控制器<代码>删除用户控制器。404指的是缺少的requestmapping,而不是找不到功能用户。使用
@WebMvcTest(DeleteUserController.class)
而不是
@WebMvcTest(DeleteUserService.class)

您试图删除的用户是否存在?我看到您正在创建一个用户,但该用户需要在存储库中,否则它只是一个本地
用户
w/除了该方法之外,在任何地方都不存在。
@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());
    }