#spring #junit #integration-testing
#spring #junit #интеграция-тестирование
Вопрос:
У нас есть несколько методов в производственном коде, аннотированных с помощью @Transaction(propagation = REQUIRES_NEW)
. Таким образом, аннотирование тестового класса с помощью @Transactional
/ @Rollback
по-прежнему приводит к загрязнению базы данных. Я хотел бы иметь метод, который мог бы удалять записи из соответствующих таблиц после завершения ВСЕХ тестов этого класса. Однако @AfterClass
метод обязательно должен быть статическим, так как я мог бы получить доступ к моему предоставленному Spring EntityManager и / или хранилищам данных Spring. Решение, которое мы используем в данный момент, заключается в аннотировании тестового класса с помощью @DirtiesContext(mode=AFTER_CLASS)
однако это приводит к действительно болезненным последствиям, если вы забываете также переопределить URL источника данных для этого тестового класса.
Итак, можно ли этого достичь более идиоматичным способом Spring / JUnit?
Ответ №1:
У меня есть набор регрессионных тестов, который работает в средах контроля качества. Поскольку он выполняет приложение, по самой своей природе он изменяет базу данных. Для этих тестов у меня есть определенные пользователи тестирования, и каждый тест создает любые записи, от которых он зависит. Во время этой настройки и во время выполнения тестов все созданные записи базы данных отслеживаются в локальной коллекции. В конце теста, то есть во время метода очистки, записи удаляются из базы данных. Я также использую имя и идентификатор тестового запуска, который позволяет легко отличить эти записи от реальных данных в случае каких-либо проблем с очисткой. Не уверен, что это соответствовало бы вашему представлению об идиоматическом Spring / JUnit, но это работает для нас и обеспечивает достаточную чистоту данных нашей среды контроля качества.
Комментарии:
1. выполняется ли этот метод очистки после каждого теста? Если бы я был доволен
@After
, я бы не стал утруждать себя публикацией вопроса. Я ищу что-то, что запускается после всех тестов в классе, но может быть нестатическим2. Вы смотрели на DBUnit? Это расширение Junit для управления состоянием базы данных для тестов.