Spring Web Unit测试 - 如何将数据库转换为已知状态?

时间:2012-01-03 08:03:36

标签: java database hibernate spring unit-testing

正如标题所说,我希望将我的数据库设置为“已知状态”以应用单元测试。我可以删除 - 每次运行单元测试之前重新创建我的数据库,但还有更好的方法吗?

我的网络应用程序目前适用于Spring上下文&冬眠。

2 个答案:

答案 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>