使用带有 Spring 的 dbunit 时出现问题(没有 spring-test-dbunit)

Problems using dbunit with Spring (without spring-test-dbunit)

我正在尝试使用 dbunit 来测试我的 DAO。我们在与 spring-test-dbunit 不兼容的版本中使用 Spring。我无法将我的 dao bean 自动连接到我的测试 class 中,因为那样的话我将不得不使用 @RunWith(SpringJUnit4ClassRunner.class) ,它涉及 one 无参数构造函数。我的 class 如下所示:

public class DbUnitExample extends DBTestCase {

    @Autowired
    public MyDAO myDAO;


    public DbUnitExample(String name) {
        super(name);
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "com.mysql.jdbc.Driver");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "...");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "...");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "...");
    }

    @Override
    protected IDataSet getDataSet() throws Exception {
        return new FlatXmlDataSetBuilder().build(new FileInputStream("target/partial.xml"));
    }

    @Override
    protected DatabaseOperation getSetUpOperation() throws Exception {
        return DatabaseOperation.REFRESH;
    }

    @Override
    protected DatabaseOperation getTearDownOperation() throws Exception {
        return DatabaseOperation.NONE;
    }

    @Test
    public void testSometing() throws Exception {
        myDAO.deleteById(12662);
    }
}

我当然得到了一个N​​PE,因为找不到我的dao bean。当我使用 @RunWith(SpringJUnit4ClassRunner.class) 时,我需要提供 one 无参数构造函数并且必须删除我的 "dbunit"-构造函数。是否有一种标准的方法或解决方法可以在不使用 spring-test-dbunit

的情况下将 dbunit 与 spring 一起使用

编辑

我的 class 现在看起来像下面这样:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/test-application.xml")
@DirtiesContext
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class })
public class DbUnitExample extends DBTestCase {

    @Autowired
    public MyDAO myDAO;

    public DbUnitExample() {
        super("target/partial.xml");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "com.mysql.jdbc.Driver");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "...");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "...");
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "...");
    }

    @Override
    protected IDataSet getDataSet() throws Exception {
        return new FlatXmlDataSetBuilder().build(new FileInputStream("target/partial.xml"));
    }

    @Override
    protected DatabaseOperation getSetUpOperation() throws Exception {
        return DatabaseOperation.REFRESH;
    }

    @Override
    protected DatabaseOperation getTearDownOperation() throws Exception {
//      return DatabaseOperation.NONE;
//      return DatabaseOperation.REFRESH;
        return DatabaseOperation.CLEAN_INSERT;
    }

    @Test
    public void testSometing() throws Exception {
        myDAO.deleteById(12662);
    }
}

它现在可以编译,但没有 dbunt 功能,这意味着如果我删除一行,它不会恢复到以前的状态(再次插入)。

由于您正在使用 Spring,我建议将 dbUnit 实例自动装配到测试中。 dbUnit Test Cases pagePrepAndExpectedTestCase 有 "Configuration Example Using Spring",但只需复制代码并将其更改为 DBTestCase 并相应地调整。