当前位置: 首页 > 面试题库 >

如何在不遇到NoSuchTableException的情况下使用具有普通JDBC和HSQLDB的DBUnit进行测试?

翁和正
2023-03-14
问题内容

我正在尝试将DBUnit与普通的JDBC和HSQLDB结合使用,并且无法完全正常工作-即使我之前将DBUnit与Hibernate结合使用也取得了很大的成功。这是代码

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:

<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();

我在这里想念什么?

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

PreparedStatement pp = databaseTester.getConnection().getConnection().prepareStatement(
“create table mytable ( itemnumber varchar(255) NOT NULL primary key, “
+ ” something varchar(255), other varchar(255) )”);
pp.executeUpdate();


问题答案:

dbUnit不创建表。XML文件中提供的有限信息也无法解决。我相信可以创建休眠表。

这是我停止使用内存数据库,而是让DBA为每个开发人员提供自己的数据库的原因之一。然后,每个开发人员都使用相同的脚本来使数据库保持最新状态,这些脚本随后将实时运行。这增加了少量的开销(所有开发人员都需要保持其数据库为最新状态),但是这意味着您无需为每次运行而构建数据库,并且可以确保查询在测试中实时运行。

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

第三个原因是拆卸是无损的(启动擦除数据库)。这意味着我可以在数据库上运行被测SQL,以帮助弄清测试失败的原因。

更新日期:20171115

从那以后,我转向使用 JUnit规则来启动数据库服务器的真实实例,并使用诸如FlywayDB之类的东西来构建数据库(并使用与测试中相同的脚本,由应用程序负责构建数据库)。它比使用预建数据库要慢得多。但是,使用定义明确的微服务(从而减少需要测试的功能)并且非常严格地限制哪些测试可以获取数据库,您可以迁移此类问题并获得始终与实时匹配的本地数据库的优势。

确实,这意味着测试撕毁总是具有破坏性的,但是可以通过放置适当的断点来解决问题。



 类似资料:
  • 问题内容: 我一直在寻找一种不用使用collections.sort就可以对数组列表进行排序的方法,因为我自己的逻辑有缺陷,而且我遇到了很多麻烦。 我需要对它进行排序,以便可以使用我创建的一种方法,该方法基本上可以执行collections.swap的工作,以便对数组列表进行完全排序。 这是我的代码: 我对此一直很烦恼。抱歉,这是在伤害社区。 问题答案: 我想,你希望下面的算法:在阵列的其余部分发

  • 我正在开发一个spring启动应用程序并编写一些junit测试。 但我发现,当我运行任何测试时,tomcat也会启动,这使得这些测试非常缓慢,浪费了很多时间。 当我开发一个SpringMvc应用程序时,junit测试可以在不启动tomcat的情况下运行,这节省了很多时间。 所以,我想问它在那里无论如何要运行启动tomcat的springstart测试?

  • 问题内容: 我有2个矩阵,我需要将它们相乘,然后打印每个单元格的结果。准备好一个单元格后,我就需要打印它,但是例如,即使[2] [0]的结果先准备好,我也需要在单元格[2] [0]之前打印[0] [0]单元格。所以我需要按顺序打印它。因此,我的想法是让打印机线程等待,直到multiplyThread通知它准备打印正确的单元格,然后printerThread它将打印该单元格并返回等待状态,依此类推。

  • 我有一个项目结构: 我用mvn clean:install构建了它,并创建了jar文件。现在,我想使用命令行运行QbsApplicationTests。为此,我在一个目录中放入了两个罐子: 并执行以下命令: 然而,我不断得到以下错误 问题: 我应该如何从控制台运行QbsApplicationTests测试 编辑我还尝试添加以下内容: 到主类,但Intellij一直说无法解析。

  • 我正在建立一个应用程序,用户将把他们的测试和作业和任何东西。我想知道我的应用程序是否有可能在测试前一周和一天发出通知? 我看到的到处都是firebase通知和push通知。 我不想要这些在线通知,我将需要应用程序发送他们自己离线。这可能吗?

  • 问题内容: 我正在解决Programming Pearls,第二版,第1列中的问题。其中一个问题涉及编写一个程序,该程序仅使用大约1 MB的内存将文件内容存储为位数组,每个位代表是否或文件中没有7位数字。由于Java是我最熟悉的语言,因此即使作者似乎已经想到了C和C ++,我还是决定使用它。 由于我是为了解决我正在处理的问题而假装有限的内存,因此我想确保读取文件的过程完全没有缓冲。 在我阅读Jav