首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不面对NoSuchTableException的情况下使用纯JDBC和HSQLDB进行DBUnit测试?

如何在不面对NoSuchTableException的情况下使用纯JDBC和HSQLDB进行DBUnit测试?
EN

Stack Overflow用户
提问于 2009-10-07 11:06:50
回答 3查看 20.3K关注 0票数 16

我正在尝试将DBUnit与普通的JDBC和HSQLDB一起使用,但不能很好地工作--尽管我以前将DBUnit与Hibernate一起使用过,并取得了很大的成功。代码如下:

代码语言:javascript
复制
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");
    }
}

这就是有问题的dataset.xml:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();

这里我漏掉了什么?

编辑:正如@mlk指出的那样,DBUnit不创建表。如果我在添加数据集之前插入以下内容,一切都会顺利进行:

代码语言:javascript
复制
PreparedStatement pp = databaseTester.getConnection().getConnection().prepareStatement(
     "create table mytable ( itemnumber varchar(255) NOT NULL primary key, "
   + " something varchar(255), other varchar(255) )");
pp.executeUpdate();

我以Is there any way for DBUnit to automatically create tables from a dataset or dtd?的身份发布了一个后续问题

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1530951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档