Spring + JUnit + H2 + JPA: можно ли отбросить-создать базу данных для каждого теста?
чтобы сохранить независимость между тестами JUnit, мне нужно создать базу данных в начале каждого теста и уничтожить ее в конце каждого теста.
база данных должна быть создана в памяти (база данных H2) путем выполнения SQL-запросов, существующих в SQL-файле (собственные запросы вставки...).
определение моих ключей-значений в файле свойств и соблюдение спецификации JPA (persistence.xml), как я могу создать базу данных-drop для каждого теста JUnit, используя аннотации / инъекции?
Спасибо большое!
3 ответов
вы должны иметь возможность использовать встроенную конфигурацию базы данных Spring для указания источника данных H2 (также показано здесь):
<jdbc:embedded-database id="dataSource" type="H2">
<!-- Modify locations appropriately for your environment -->
<jdbc:script location="classpath:db-schema.sql"/>
<jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:embedded-database>
это должно пойти в ваш тест-специфический testApplicationContext.xml
с соответствующими объявлениями пространства имен.
Spring создаст источник данных H2, когда он вызовет контекст тестового приложения в начале набора тестов (тестовый класс). Поскольку Spring кэширует контекст приложения на протяжении всего тестового класса, можно аннотировать тестовый класс с помощью @DirtiesContext
таким образом, контекст приложения повторно создается и источник данных повторно инициализируется для каждого метода тестирования:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/your/testApplicationContext.xml"})
@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
public class SomeDatabaseTest {
@Autowired
private SomeDao dao;
// Test methods
}
больше информации о функциональности встроенной базы данных Spring можно найти здесь
вы, вероятно, должны использовать функции JPA или Spring, но только для полноты:
на стороне базы данных, H2 поддерживает запуск скриптов init при открытии базы данных следующим образом:
jdbc:h2:mem:test;INIT=runscript from '~/create.sql'
или
jdbc:h2:mem:test;INIT=runscript from 'classpath:/com/acme/create.sql'
и когда вы закрываете базы данных в памяти (как в примере выше), данные удаляются. Или вы можете запустить инструкцию SQL drop all objects
.