从dbunit测试用例中抛出NoSuchTableException

时间:2009-02-19 01:04:27

标签: java exception dbunit

我正在尝试修复一个项目的测试套件,我从另一个程序员那里继承了一些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:也是一个很好的建议。谢谢你的提示;希望这将使我走上正确的道路来解决这个问题。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

需要更多信息才能解决此问题。

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

答案 2 :(得分:1)

sleske确实是对的 - 需要更多的信息才能解决这个问题,这意味着我没有提出正确的问题。虽然这里的两个建议都很有帮助,但我觉得很糟糕,因为我没有问正确的问题,所以我认为这是正确的答案,所以我会在这里记录我做了什么才能使这个工作。

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

另外,我必须根据我找到的in this blog post about using hibernate and dbunit together重写一些数据库测试用例基类代码。

最后,我需要修复我们的构建过程,以便使用“hibernate-test.cfg.xml”文件代替实际配置,然后一切正常。现在我只需要弄清楚为什么有些测试用例会抛出异常。 :)