一种可行的方法是创建一个“数据初始化器”类,将其添加到也具有您的数据源的测试 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>
和
public class DatabaseInitialiser extends JdbcDaoSupport {
@PostConstruct
public void load() {
// Initialise your database here: create schema, use DBUnit to load data, etc.
}
}
在这个例子中:
- 所有依赖数据库的测试都扩展了
DataLoadingTest
;
- Spring 在第一次测试调用时初始化应用程序上下文;
DatabaseInitialiser.load()
这通过@PostConstruct
注解调用;
- Spring 将应用程序上下文保存在缓存中;
- 进一步的测试调用
DatabaseInitialiser
从已经缓存的应用程序上下文中连接;
- 测试是事务性的,并在最后回滚到初始数据集。
同样,DatabaseInitialiser
可以有一个方法注释@PostDestroy
来在整个测试运行结束时执行任何必要的回滚。