Как издеваться над поведением метода void при модульном тестировании моей службы удаления? - PullRequest
1 голос
/ 19 июня 2020

В настоящее время я тестирую модули конечных точек Spring Boot CRUD RESTful API, и у меня есть следующая конечная точка «Удалить пользователя по его идентификатору» , состоящая из контроллера и service для реализации своего logi c:

Удалить контроллер (в основном он вызывает logi c службы и определяет некоторые рекомендации):

 @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 , что означает, что он выбрасывает исключение, которое должно быть сгенерировано, когда пользователь не ' t существует.

Я думаю, что ответ в том, как мне нужно имитировать поведение моих служб logi c, но я понятия не имею, как это сделать. Был бы признателен, если бы кто-нибудь мог мне помочь с этим.

1 Ответ

1 голос
/ 19 июня 2020

Тестовый уровень Web MVC не настроен для включения тестируемого контроллера; DeleteUserController. 404 относится к отсутствующему сопоставлению запросов, а не к функциональному пользователю, который не найден. Используйте @WebMvcTest(DeleteUserController.class) вместо @WebMvcTest(DeleteUserService.class).

...