Один из подходов, который работает, - это создать класс «инициализатора данных», добавить его в контекст приложения Spring для тестирования, в котором также есть источник данных, и подключить этот контекст приложения в свои тесты.Это основано на том факте, что Spring кэширует контекст приложения между вызовами теста.
Например, суперкласс теста:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test-application-context.xml"})
@Transactional
public abstract class DataLoadingTest {
@Autowired
protected DatabaseInitialiser databaseInitialiser;
}
С test-application-context.xml
:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" .../>
<bean class="DatabaseInitialiser">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
And
public class DatabaseInitialiser extends JdbcDaoSupport {
@PostConstruct
public void load() {
// Initialise your database here: create schema, use DBUnit to load data, etc.
}
}
В этом примере:
- все тесты, основанные на базе данных, расширяются
DataLoadingTest
; - Spring инициализирует контекст приложения при первом тестированииinvocation;
- это вызывает
DatabaseInitialiser.load()
через аннотацию @PostConstruct
; - Spring сохраняет контекст приложения в кэше;
- дальнейшие тестовые вызовы передаются в
DatabaseInitialiser
из контекста приложения, который уже кэширован; - тесты являются транзакционными и в конце возвращаются к исходному набору данных.
Аналогично, DatabaseInitialiser
может иметьаннотированный метод @PostDestroy
для выполнения любого отката, необходимого в конце всего тестового прогона.