Проблемы с использованием dbunit с Spring (без spring-test-dbunit)

Я пытаюсь использовать dbunit для проверки моих DAO. Мы используем Spring в версии, которая не совместима с spring-test-dbunit. Я не могу автоматически подключить мои dao-бины к моему тестовому классу, потому что тогда мне придется использовать @RunWith(SpringJUnit4ClassRunner.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);
    }
}

Конечно, я получаю NPE, потому что мой боб дао не может быть найден. Когда я использую @RunWith(SpringJUnit4ClassRunner.class) Мне нужно предоставить один конструктор без параметров и удалить мой конструктор "dbunit". Существует ли стандартный способ или обходной путь для использования dbunit с пружиной без использования spring-test-dbunit

РЕДАКТИРОВАТЬ

Мой класс теперь выглядит следующим образом:

@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, что означает, что если я удаляю строку, она не восстанавливается до своего прежнего состояния (вставляется снова).

1 ответ

Решение

Поскольку вы используете Spring, я предлагаю автоматически подключить экземпляры dbUnit к тесту. Страница тестовых примеров dbUnit содержит "Пример конфигурации с использованием Spring" для PrepAndExpectedTestCase, но просто скопируйте код и измените его на DBTestCase и настроить соответственно.

Другие вопросы по тегам