тестовый Junit deleteById не проходит, если идентификатор отсутствует

#java #spring #unit-testing #jpa #junit

#java #весна #модульное тестирование #jpa #junit

Вопрос:

Я провожу несколько тестов junit, чтобы улучшить свое приложение. Один из них проверяет удаление одного необработанного файла (обозначенного идентификатором в качестве первичного ключа), если он присутствует, и это работает нормально. Теперь я проверяю, как ведет себя мое приложение, если я хочу удалить идентификатор, отсутствующий в моей базе данных.

Я ожидаю, что мой тест пройдет с 0 затронутыми строками, но он не проходит, выдавая мне эту ошибку:

Не существует объекта класса com.package1.package2.package3.entities.className с идентификатором 326L!

Какой-нибудь совет?

Комментарии:

1. добавьте код, который выдает ошибку

2. jpa автоматически генерирует запрос. Я вызываю только public void deleteById(id). Я ожидаю чего-то вроде sql-запроса, если delete не находит данные для удаления. Просто 0 строк, на которые влияет команда удаления

Ответ №1:

deleteById() CrudRepository сначала пытается найти объект по Id .

В случае, если объект не найден, он выдает исключение; У вас может быть свой собственный репозиторий и объявить deleteAllByIdIn() метод, который принимает коллекцию идентификаторов в качестве аргумента, и ORM создаст для вас его реализацию.

Таким образом, вы не должны получать никаких исключений, даже если объекты с такими идентификаторами отсутствовали. Или вы всегда можете создать собственный SQL-запрос, который удаляет строку в БД по идентификатору.

Комментарии:

1. Просто попытался написать собственный запрос. Теперь выдает это: Вызвано: org.postgresql.util. Исключение PSQLException: запрос не вернул результатов. Кстати, используя собственный запрос для удаления существующего идентификатора, запрос работает.

2. Вы использовали репозиторий для создания собственного запроса? Если это так, возможно, вы забыли указать аннотацию @Modifying

Ответ №2:

РЕШЕНИЕ:

Метод должен быть :

     @Query (your query, nativeQuery=true)

    @Modifying
    @Transactional
    void DeleteById(@Param(id) Long id)