2012-03-30 38 views
2

我正在使用DBUnit测试用Hibernate和Spring实现的DAO。我在DBUnit的设置代码中放置了一个断点,我发现相应的方法从不会被调用。我需要按照CLEAN_INSERT方案初始化我的数据库,但从不调用安装方法(从TestCase中重写)。未调用DBUnit设置方法?

有什么想法?

编辑:我在maven依赖图中看到,DBunit 2.4.8(最后一个版本)依赖于JUnit 3.8.2 ?! DBUnit是否与更新版本的JUnit(4.9)兼容?

感谢

回答

3

如果您使用JUnit 4中,你不应该从TestCase的任何更多的延伸。将示例代码放在http://www.dbunit.org/howto.html#noextend的自己的方法中。只要您使用@org.junit.Before对其进行注释,就可以将其称为任何您想要的内容。

+0

我没有确切地说我正在使用第一种方法,即从DBTestCase类扩展。在这种情况下,我不应该定义设置和拆卸方法。 – 2012-03-30 13:32:54

+0

我从来没有使用过基于JUnit 3代码的'DBTestCase',并且要求您为JUnit 3设置相关的框架,而不是使用JUnit 4处理这些事情的方式。相反,您可以编写自己的父类来处理数据库设置,拆卸,并使用CLEAN_INSERT重新加载数据集。 – 2012-03-30 13:46:09

0

您当然可以在JUnit 4.x中使用DBUnit。我试图使用vanilla JDBC为你留下Spring和Hibernate的例子。虽然,我强烈建议尽量让this open source utility让您的Spring和DBUnit体验更加愉快。请注意,我没有对该实用程序做出贡献,只是使用它。

另一个DBUnit挑战是它不会为您创建表,因此内存数据库可能会给您提供问题,请参阅this other stackoverflow post以了解更多详细信息。

我正在使用DBUnit 2.4.8,HSQLDB 1.8.0.10和JUnit 4.10。

import static org.junit.Assert.assertEquals; 

import java.io.StringReader; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import org.dbunit.IDatabaseTester; 
import org.dbunit.JdbcDatabaseTester; 
import org.dbunit.dataset.IDataSet; 
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; 
import org.dbunit.operation.DatabaseOperation; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 

public class DBUnitTester { 

    private IDatabaseTester databaseTester; 

    @Before 
    public void init() throws Exception { 
    databaseTester = new JdbcDatabaseTester(org.hsqldb.jdbcDriver.class.getName(), "jdbc:hsqldb:sample", "sa", ""); 

    createTablesSinceDbUnitDoesNot(databaseTester.getConnection().getConnection()); 

    String inputXml = 
     "<dataset>" + 
     " <TEST_TABLE COL0=\"row 0 col 0\" " + 
     "    COL1=\"row 0 col 1\"" + 
     "    COL2=\"row 0 col 2\"/> " + 
     "</dataset>"; 
    IDataSet dataSet = new FlatXmlDataSetBuilder().build(new StringReader(inputXml)); 
    databaseTester.setDataSet(dataSet); 
    databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT); 
    databaseTester.setTearDownOperation(DatabaseOperation.DELETE_ALL); 
    databaseTester.onSetup(); 
    } 

    private void createTablesSinceDbUnitDoesNot(Connection connection) throws SQLException { 
    PreparedStatement statement = connection.prepareStatement("CREATE TABLE TEST_TABLE(COL0 VARCHAR(20), COL1 VARCHAR(20), COL2 VARCHAR(20))"); 
    statement.execute(); 
    statement.close(); 

    } 

    @Test 
    public void firstTest() throws SQLException, Exception { 
    PreparedStatement statement = databaseTester.getConnection().getConnection().prepareStatement("SELECT COL0 FROM TEST_TABLE"); 
    ResultSet rs = statement.executeQuery(); 
    rs.next(); 
    assertEquals("row 0 col 0", rs.getString("COL0")); 
    } 


    @After 
    public void cleanUp() throws Exception { 
    databaseTester.onTearDown(); 
    } 
}