Я использую Spring CrudRepository для доступа к БД, и в тестах требовалось чистое состояние, поэтому имел метод, подобный этому
@Before
public void setupDBs() {
companyRepository.deleteAll();
DBUtil.createTestCompanies(companyRepository);
}
Добавил несколько тестов, и он работал, но затем начал получать
Причина: org.h2.jdbc.JdbcSQLException: нарушение уникального индекса или первичного ключа: ... вставить в компанию
Из консоли кажется, что эта строка
2018-12-21 13: 45: 40.984 DEBUG 6283 --- [main] org.hibernate.SQL: вставка в компанию
из DBUtil.createTestCompanies(companyRepository);
была выполнена после запуска теста, хотябыл в @Before
методе.Попытка добавить @Transactional
к обоим @Before
и @Test
методам, но она осталась прежней.
Решением было перенести очищающую БД сюда
@After
public void clearDB(){
companyRepository.deleteAll();
}
, и теперь она работает.Но кто-то может объяснить это поведение?Как это возможно, что оператор из @Before
выполняется в тесте?