Estoy tratando de usar DBUnit con JDBC y HSQLDB, y no puedo hacer que funcione, aunque he usado DBUnit con Hibernate anteriormente con gran éxito. Aquí está el código:¿Cómo pruebo con DBUnit con JDBC y HSQLDB sin enfrentar una excepción NoSuchTableException?
import java.sql.PreparedStatement;
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.XmlDataSet;
import org.junit.Test;
public class DummyTest {
@Test
public void testDBUnit() throws Exception {
IDatabaseTester databaseTester = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem", "sa", "");
IDataSet dataSet = new XmlDataSet(getClass().getResourceAsStream("dataset.xml"));
databaseTester.setDataSet(dataSet);
databaseTester.onSetup();
PreparedStatement pst = databaseTester.getConnection().getConnection().prepareStatement("select * from mytable");
}
}
Y esta es la dataset.xml en cuestión:
<dataset>
<table name="mytable">
<column>itemnumber</column>
<column>something</column>
<column>other</column>
<row>
<value>1234abcd</value>
<value>something1</value>
<value>else1</value>
</row>
</table>
</dataset>
Esta prueba me da una NoSuchTableException:
org.dbunit.dataset.NoSuchTableException: mytable
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:282)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at DummyTest.testDBUnit(DummyTest.java:18)
Si quito el databaseTester.onSetup () línea, me sale una SQLException en su lugar:
java.sql.SQLException: Table not found in statement [select * from mytable]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
at DummyTest.testDBUnit(DummyTest.java:19)
El conjunto de datos en sí mismo está funcionando, ya que puedo acceder a ella como debería:
ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();
Qué me estoy perdiendo aquí?
EDIT: Como @mlk señala, DBUnit no crea tablas. Si inserto lo siguiente antes de añadir el conjunto de datos, todo va bien:
PreparedStatement pp = databaseTester.getConnection().getConnection().prepareStatement(
"create table mytable (itemnumber varchar(255) NOT NULL primary key, "
+ " something varchar(255), other varchar(255))");
pp.executeUpdate();
He publicado una pregunta de seguimiento como Is there any way for DBUnit to automatically create tables from a dataset or dtd?
ahora han cambiado a una instancia local de Oracle XE se ejecuta en una máquina virtual. La razón de esto es que podemos seguir desarrollando cuando no está conectado a la red interna. –
Con una base de datos en memoria, puedo ejecutar pruebas de unidades en cualquier lugar, sin tener que cambiar ninguna configuración y sin tener que iniciar un servidor de bases de datos. Principalmente se ejecutan en varios cuadros de desarrollo y en el servidor de CI. Esa es una gran ventaja en mi libro. – Spencer
Sí lo es. Personalmente encontré que es significativamente más lento, sin embargo, esto puede haber cambiado ahora. El tiempo necesario para iniciar una instancia de Oracle XE de VM'ed local es algo breve una vez al día. –