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.


JPA2.1 поддерживает drop-and-create схемы при инициализации ЭДС.