#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)