JUnit + Mockito тестирование исключения

448
07 января 2017, 13:23

Контроллер

@RequestMapping(
        value = "api/message/{id}",
        method = RequestMethod.DELETE)
public ResponseEntity<?> deleteMessage(@PathVariable Long id) {
    messageService.delete(id);
    return new ResponseEntity<>(HttpStatus.OK);
}

Нужно проверить на исключение если запросить удаление несуществующего id.

Возвращает

{
"timestamp": 1483566196066,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.EmptyResultDataAccessException",
"message": "No class com.sttech.springrest.model.Message entity with id 1000 exists!",
"path": "/api/message/1000"
}

Тест метод

@Test(expected = EmptyResultDataAccessException.class)
    public void deleteMessageIfNotFoundThenException() {
    messageController.deleteMessage(2L);
}

Возвращает ошибку

java.lang.AssertionError: Expected exception: org.springframework.dao.EmptyResultDataAccessException

Если так:

@Test(expected = EmptyResultDataAccessException.class)
public void deleteMessageIfNotFoundThenException1() {
    when(messageController.deleteMessage(2L));
    then(caughtException())
            .isInstanceOf(EmptyResultDataAccessException.class)
            .hasMessageContaining("entity with id 2 exists!");
}

Возвращает ошибку

java.lang.Exception: Unexpected exception, expected<org.springframework.dao.EmptyResultDataAccessException> but was<java.lang.AssertionError>

Вообще это исключение надо тестировать в контроллере?

Answer 1

Тестировать надо только, если есть поведение. В ваше случае можете проверить, что контроллер вызвал у сервиса/репозитории правильный метод и вернул правильный результат. Я бы исключение не тестировал, но если вы хотите, то можно вот так

@Test(expected = EmptyResultDataAccessException.class)
public void deleteMessageIfNotFoundThenException1() {
    when(messageService.delete(2L)).thenThrow(new EmptyResultDataAccessException());
    messageController.deleteMessage(2L);
}

Если вы делаете REST сервис, то операция DELETE должна быть idempotent, т.е. состояние системы не меняется, даже если метод был вызван несколько раз (N>0) подряд.

READ ALSO
Как можно удалить данные из БД по id из RecyclerView

Как можно удалить данные из БД по id из RecyclerView

Коллеги, спасите, дедлайн уже близкоРабота встала

438
Ошибка в PreparedStatement

Ошибка в PreparedStatement

Использую ajax, для поискаВвожу несколько символов

294
JOGL OpenGL java Поворот матриц и glPushMatrix

JOGL OpenGL java Поворот матриц и glPushMatrix

собственно код вот такой

415
Изменение watermark itext7 java

Изменение watermark itext7 java

Необходимо с помощью библиотеки для JAVA iText 7 изменить Watemark (водный знак) на первой странице pdf файла, то есть имеется готовый pdf и в нем есть...

364