0

我正在尝试修复一个项目的测试套件,该项目是我从另一个程序员那里继承的一些 java 数据库代码。项目本身使用hibernate 和MySQL 作为数据库的东西,但为了测试用例的目的,正在使用dbunit。我可以正确加载和初始化hibernate的会话工厂,但是当我尝试在Eclipse中运行我的测试时,我不断收到异常,即“org.dbunit.dataset.NoSuchTableException:mytablename”。

我知道所有文件都在正确的位置,并且我传递给 dbunit 的实际 XML 文件是可以的(我使用的是 FlatXmlDataSet 类型)。我在数据库测试用例基类中的 setUp() 方法如下所示:

@Override
protected void setUp() throws Exception {
    super.setUp();
    IDataSet dataSet = new FlatXmlDataSet(new File(mDataFile));

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    IDatabaseConnection connection = new DatabaseConnection(session.connection());

    DatabaseConfig config = connection.getConfig();
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());

    DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);

    session.getTransaction().commit();
}

在 CLEAN_INSERT 数据库操作之后,立即抛出异常,抱怨我的 XML 文件中的最后一个表,无论这是哪个表。我已经手动和使用 Eclipse 验证了 DTD 和 XML 模式,甚至到了确保两个文件中表的顺序匹配的地步。我宁愿不将这些文件粘贴到此处(因为它会涉及大量搜索替换),但请相信我,我已经查看了 dbunit 示例并确保语法匹配。

关于什么可能是错误的任何想法?我已经在谷歌上搜索了几个小时,但找不到任何有用的东西。

编辑:我忘记提及的一件事是,当我在抛出的行上放置一个断点时,我可以查看 dataSet 的结构并看到我的所有表以及所有测试数据实际上都在那里。所以至少那部分似乎工作正常。

@Bogdan:嗯……好主意。我将尝试使用常规 INSERT 加载数据。@sleske:也是一个很好的建议。感谢您的提示;希望这将使我走上解决此问题的正确道路。

4

3 回答 3

1

DatabaseOperation.CLEAN_INSERT本质上是和DatabaseOperation.DELETE_ALL的组合DatabaseOperation.INSERT。由于DatabaseOperation.DELETE_ALL以相反的顺序清除表,我怀疑在清除最后一个表时它不会失败,但在清除第一个表时。

您确定您的数据集中的表确实存在于您在测试时使用的数据库中吗?您得到的错误表明他们没有。

于 2009-02-19T02:10:28.097 回答
1

需要更多信息来解决这个问题。

你试过调试这个吗?您可以将 DBUnit 的源代码作为一个单独的项目放入您的 Eclipse 工作区。然后配置测试的“构建路径”以使用 DBUnit 项目而不是 dbunit.jar。这样您就可以调试 DBUnit 的代码。然后你会希望看到它为什么会抛出异常。

于 2009-02-19T03:08:27.020 回答
1

sleske 确实是对的——需要更多信息来解决这个问题,这意味着我没有问对正确的问题。虽然这里的两个建议都很有帮助,但我会觉得将其中一个标记为正确答案很糟糕,因为我没有问正确的问题,所以我将在这里记录我为使其正常工作所做的工作。

基本上,问题是由其他类型的架构不匹配引起的。测试数据库的 DTD 和 XML 匹配,但 DTD 不再匹配 hbm.xml 文件中列出的实际模式(即我们在生产数据库中使用的模式),并且 XML 文件中的测试数据库缺少某些列后来被标记为 NOT NULL。此外,XML 包含没有 .hbm.xml 配置文件的表,因为该代码的原始作者从未开始编写将使用这些表的功能。因此,即使在 DTD 中指定了它们,缺少相应的 HBM 映射也会导致问题。

此外,我不得不根据我在这篇关于同时使用 hibernate 和 dbunit 的博客文章中发现的内容重写我们的一些数据库测试用例基类代码。

Finally, I needed to fix our build process so that a "hibernate-test.cfg.xml" file was used in place of the real configuration, and then everything worked fine. Now I just need to figure out why some of the test cases are throwing exceptions. :)

于 2009-02-24T09:25:43.550 回答