Как очищать таблицы базы данных после каждого интеграционного теста при использовании Spring Boot и Liquibase? - PullRequest
1 голос
/ 13 июля 2020

У меня есть побочный проект, в котором я использую Spring Boot, Liquibase и Postgres.

У меня есть следующая последовательность тестов:

test1();
test2();
test3();
test4();

В этих четырех тестах я Создаю такую ​​же организацию. Поскольку я не удаляю записи из таблицы после каждого тестового примера, я получаю следующее исключение: org.springframework.dao.DataIntegrityViolationException

Я хочу решить эту проблему со следующими ограничениями:

  1. Я не хочу использовать @repository для очистки базы данных.
  2. Я не хочу уничтожать базу данных и создавать ее в каждом тестовом примере, потому что я использую TestContainers и делаю это увеличит время, необходимое для завершения тестов.

Вкратце: как я могу удалить записи из одной или нескольких таблиц после каждого тестового примера без 1) использования @repository каждого объекта и 2) уничтожение и запуск контейнера базы данных в каждом тестовом примере?

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Вы можете использовать @Transactional в своих методах тестирования. Таким образом, каждый тестовый метод будет выполняться внутри своей собственной корзины транзакции и будет откат перед запуском следующего тестового метода.

Конечно, это работает, только если вы не делаете ничего странного с ручным управлением транзакциями, и он зависит от некоторого мага автоконфигурации Spring Boot c, поэтому это может быть невозможно в каждом случае использования, но, как правило, это очень эффективный и очень простой подход к изоляции тестовых случаев.

1 голос
/ 13 июля 2020

Добавьте в свой тестовый класс аннотацию @DataJpaTest. Из документации:

По умолчанию тесты, помеченные @DataJpaTest, являются транзакционными и откатываются в конце каждого теста. Они также используют встроенную базу данных в памяти (заменяющую любой явный или обычно автоматически настраиваемый источник данных).

Например, используя Junit4:

@RunWith(SpringRunner.class)
@DataJpaTest
public class MyTest { 
//...
}

Используя Junit5:

@DataJpaTest
public class MyTest { 
//...
}
1 голос
/ 13 июля 2020

Самый простой способ, который я нашел, был следующий:

  1. Вставить экземпляр JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
Используйте класс JdbcTestUtils для удаления записей из необходимых вам таблиц.
JdbcTestUtils.deleteFromTables(jdbcTemplate, "table1", "table2", "table3");
Вызовите эту строку в методе, помеченном @After или @AfterEach в вашем тестовом классе:
@AfterEach
void tearDown() throws DatabaseException {
    JdbcTestUtils.deleteFromTables(jdbcTemplate, "table1", "table2", "table3");
}

Я нашел этот подход в этом сообщении в блоге: Easy Integration Testing С тестовыми контейнерами

...