Метод установки DBUnit не вызван?

Я использую DBUnit для тестирования DAO, реализованных с помощью Hibernate и Spring. Я установил точку останова в установочном коде DBUnit и вижу, что соответствующие методы никогда не вызываются. Мне нужно инициализировать мою базу данных по схеме CLEAN_INSERT, но метод настройки (переопределенный из TestCase) никогда не вызывается.

Любая идея?

РЕДАКТИРОВАТЬ: на графике зависимостей maven я видел, что DBunit 2.4.8 (последняя версия) зависит от JUnit 3.8.2 ?! Совместим ли DBUnit с более новыми версиями JUnit (4.9)?

Спасибо


person Mickael Marrache    schedule 30.03.2012    source источник


Ответы (2)


Если вы используете JUnit 4, вам больше не следует расширяться от TestCase. Поместите код из примера в http://www.dbunit.org/howto.html#noextend в вашем собственном методе. Вы можете называть его как угодно, если пометите его с помощью @org.junit.Before.

person artbristol    schedule 30.03.2012
comment
Я не уточнил, что использую первый метод, то есть расширение от класса DBTestCase. В этом случае я не должен определять методы установки и удаления. - person Mickael Marrache; 30.03.2012
comment
Я никогда не использовал DBTestCase, который основан на коде JUnit 3 и требует, чтобы вы установили связанную структуру для JUnit 3, а не использовали способ, которым JUnit 4 обрабатывает эти вещи. Вместо этого вы можете написать свой собственный родительский класс, который обрабатывает настройку базы данных, удаление и использует CLEAN_INSERT для перезагрузки набора данных. - person David H. Clements; 30.03.2012

Вы, безусловно, можете использовать DBUnit с JUnit 4.x. Я попытался создать пример с использованием ванильного JDBC, оставив вам Spring и Hibernate. Хотя я настоятельно рекомендую дать это утилита с открытым исходным кодом, чтобы сделать вашу работу с Spring и DBUnit более приятной. Обратите внимание, я не участвовал в этой утилите, просто использовал ее.

Еще одна проблема DBUnit заключается в том, что он не создает таблицы для вас, поэтому база данных в памяти может вызвать проблемы. Взгляните на в этом другом сообщении stackoverflow для более подробной информации.

Я использую 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();
  }
}
person Jason Griebeler    schedule 30.03.2012