РЕДАКТИРОВАТЬ: Как предложил С. Вебер в комментариях, решение состоит в том, чтобы добавить @Transactional
к классу тестов.
У меня есть несколько тестов, которые используют H2 в памятиDB.Мне нужно сбросить БД перед каждым тестом.Хотя мои сценарии SQL запускаются при каждом выполнении теста, БД не сбрасывается должным образом, что приводит к отсутствию необходимой записи после теста удаления.
Класс теста:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureTestDatabase(replace=Replace.ANY, connection=EmbeddedDatabaseConnection.H2)
public class RepositoryTests {
@Autowired
private Repository repository;
@Autowired
private DataSource dataSource;
@Before
public void populateDb() {
Resource initSchema = new ClassPathResource("database/schema.sql");
Resource initData = new ClassPathResource("database/data.sql");
DatabasePopulator dbPopulator = new ResourceDatabasePopulator(initSchema, initData);
DatabasePopulatorUtils.execute(dbPopulator, dataSource);
}
@Test
public void testMethod1() {
// ...
repository.delete("testdata");
}
@Test
public void testMethod2() {
// ...
Object test = repository.get("testdata");
// is null but should be an instance
}
}
схема.sql удаляет все таблицы перед их воссозданием.data.sql вставляет все необходимые тестовые данные в БД.
Выполнение одного testMethod2
успешно.Однако выполнение всех тестов приводит к сбою теста с NullPointerException
.
Я успешно попытался использовать @DirtiesContext
, однако это не вариант, потому что я не могу позволить себе 20-секундный запуск длякаждый 0,1-секундный тест.
Есть ли другое решение?