如何使用JDBC和HSQLDB使用DBUnit进行测试,而不面临NoSuchTableException?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (124)

我正试图将DBUnit与JDBC和HSQLDB结合使用,但无法完全实现它--尽管我之前在Hibernate中使用了DBUnit,并且取得了很大的成功。下面是代码:

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");
    }
}

这是所讨论的数据et.xml:

<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>

这个测试给了我一个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)

如果删除databaseTester.onSetup()行,则会得到一个SQLException:

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)

数据集本身也正常工作,因为我可以像应该访问的那样访问它:

ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();

我在这里错过了什么?

提问于
用户回答回答于

dbUnit不创建表。XML文件中提供的有限信息也不能。我相信Hibernate可以创建表。

这是我停止使用内存数据库的原因之一,而是让DBA为每个开发人员提供自己的数据库。然后,每个开发人员都使用稍后在现场运行的相同脚本来更新数据库。这增加了一小部分开销(所有开发人员都需要保持数据库的最新更新),但这意味着您不需要为每次运行构建数据库而搞砸,您可以确保查询在现场测试中运行。

第二个原因是速度。我发现创建内存数据库所花费的时间比简单地连接到现有数据库花费的时间要长得多。

第三个原因是拆除没有破坏性(启动删除数据库)。这意味着我可以在数据库上运行测试中的SQL,以帮助找出测试失败的原因。

用户回答回答于

SpringBoot/SpringJDBC可以使用普通JDBC初始化数据库。

SpringJDBC具有DataSource初始化功能。Spring Boot默认启用它,并从标准位置加载sql。schema.sqldata.sql(在类路径的根部)。此外,SpringBoot将加载schema-${platform}.sqldata-${platform}.sql文件(如果存在的话),其中平台是spring.datasource.platform,例如,您可以选择将其设置为数据库的供应商名称(hsqldb、h2、oracle、MySQL、PostgreSQL等)。

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

扫码关注云+社区