正如标题所说,我希望将我的数据库设置为“已知状态”以应用单元测试。我可以删除 - 每次运行单元测试之前重新创建我的数据库,但还有更好的方法吗?
我的网络应用程序目前适用于Spring上下文&冬眠。
答案 0 :(得分:3)
我建议你使用一个名为DBUnit的工具 - 它可以完全满足您的需求。网上有大量的例子与Spring&冬眠。
加载数据:
@Before
public void onSetUpInTransaction() throws Exception {
Connection conn = dataSource.getConnection();
try {
IDatabaseConnection connection = new DatabaseConnection(conn);
DatabaseConfig config = connection.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new HsqldbDataTypeFactory());
DataFileLoader loader = new FlatXmlDataFileLoader();
IDataSet ds = loader.load(TEST_DATA_FILE_CLUB);
DatabaseOperation.CLEAN_INSERT.execute(connection,ds);
} finally {
DataSourceUtils.releaseConnection(conn, dataSource);
}
}
这将获取TEST_DATA_FILE_CLUB字符串中引用的XML文件,并将其加载到数据库的干净的内存中副本中。
要清理,只需使用另一个方法,使用@After注释,然后使用DELETE_ALL数据库操作。
假设您正在使用JUnit,将这些方法放在测试类中或测试类可以扩展的超类中,将允许您快速地为每个单独的测试设置数据库。
要加载的XML文件很简单:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<competition competitionId="1" competitionName="Competition 1"
senior="1" junior="0"/>
</dataset>
会将一行加载到竞争表中,并指定列值。高级&amp;初级栏目是布尔人。
答案 1 :(得分:1)
如果您正在进行某种集成测试,那么尝试设计测试,以便无论其他测试是否失败,它们都能正常工作。
然后,您只需要设置一次数据库(在第一次测试之前)
Btw:我强烈建议使用不同的数据库(一个用于开发),另一个用于测试。更多技术细节: *如果您使用inmemmory db进行中小型测试,则可以使用spring jdbc支持
<jdbc:embedded-database id="dataSource" type="H2" >
<jdbc:script location="classpath:init.sql" />
</jdbc:embedded-database>