【问题标题】:dbunit test fails with NoSuchTableException, but table existsdbunit 测试失败并出现 NoSuchTableException,但表存在
【发布时间】:2023-03-15 06:10:01
【问题描述】:

错误

java org.junit.runner.JUnitCore TestCase
JUnit version 4.10
.E..
Time: 0.28
There was 1 failure:
1) testDbNoChanges(TestCase)
org.dbunit.dataset.NoSuchTableException: Did not find table 'EVENTS' in schema 'null'

问题

这个错误是什么意思?我究竟做错了什么?为什么架构为空?

第二个测试,实际测试一个表,通过了。该测试应该只是测试数据库,但失败了。表在之前和之后都存在。

mysql> show tables;
+---------------+
| Tables_in_cal |
+---------------+
| events        |
| guests        |
| test          |
+---------------+
3 rows in set (0.00 sec)

来源

我相信这是有用的 sn-p,但一切都在 https://bitbucket.org/djeikyb/simple_dbunit

 36 public class TestCase
 37 {
 38 
 39   private IDatabaseTester database_tester;
 40 
 41 
 42   public IDataSet getDataSet() throws FileNotFoundException, DataSetException
 43   {
 44     return new FlatXmlDataSetBuilder().build(
 45         /*
 46         new FileInputStream("src/simple_dbunit/expected_dataset.xml"));
 47         new FileInputStream("dataset.xml"));
 48          */
 49         new FileInputStream("dataset.xml"));
 50   }
 51 
 52 
 53   @Before
 54   public void setUp() throws Exception
 55   {
 56     database_tester = new JdbcDatabaseTester("com.mysql.jdbc.Driver",
 57                                             "jdbc:mysql://localhost/cal",
 58                                             "cal",
 59                                             "cal");
 60     database_tester.setDataSet(getDataSet());
 61     database_tester.onSetup();
 62   }
 63 
 64   @Test
 65   public void testDbNoChanges() throws Exception
 66   {
 67     // expected
 68     IDataSet expected_data_set = getDataSet();
 69 
 70     // actual
 71     IDatabaseConnection connection = database_tester.getConnection();
 72     IDataSet actual_data_set = connection.createDataSet();
 73 
 74     // test
 75     Assertion.assertEquals(expected_data_set, actual_data_set);
 76   }
 77 
 78   @Test
 79   public void testTableNoChanges() throws Exception
 80   {
 81     // expected
 82     ITable expected_table = getDataSet().getTable("test");
 83 
 84     // actual
 85     IDatabaseConnection connection = database_tester.getConnection();
 86     IDataSet actual_data_set = connection.createDataSet();
 87     ITable actual_table = actual_data_set.getTable("test");
 88 
 89     // test
 90     Assertion.assertEquals(expected_table, actual_table);
 91   }
 92 
 93   @Test
 94   public void testTableNoChanges1() throws Exception
 95   {
 96     // expected
 97     ITable expected_table = getDataSet().getTable("test");
 98 
 99     // actual
100     IDatabaseConnection connection = database_tester.getConnection();
101     IDataSet actual_data_set = connection.createDataSet();
102     ITable actual_table = actual_data_set.getTable("test");
103 
104     // test
105     Assertion.assertEquals(expected_table, actual_table);
106   }
107 
108 }

【问题讨论】:

    标签: java junit junit4 dbunit


    【解决方案1】:

    See Here for similar problem

    我很确定您还需要设置区分大小写的选项。您的 DB 后端可能不喜欢大写的表名请求!

    【讨论】:

    • 错误信息相同,但情况不同。我可以拥有四个testTableNoChanges() 的副本,只有testDbNoChanges() 失败。我不相信问题出在 CLEAN.INSERT 上。
    • 拥有testTableNoChanges() 的多个副本全部通过也让我相信dbunit 尊重我的表的情况。我猜它的重点是全部大写。也就是说,如果你能指出我愿意尝试 dbunit 中区分大小写的选项。
    • 你会想要做类似的事情: > DatabaseConfig config = connection.getConfig(); > config.setFeature(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
    • 酷。 setFeature() 已弃用,所以我使用了config.setProperty("http://www.dbunit.org/features/caseSensitiveTableNames", true); 我还找到了一个方便的可设置属性列表:dbunit.sourceforge.net/properties.html
    • 不幸的是,错误仍然存​​在。我用 getProperty() 检查了我的 setProperty(),所以看起来 dbunit 现在应该区分大小写。该错误仍然显示全部大写“事件”
    【解决方案2】:

    我目前没有MySql环境,所以无法确认。但我想我知道问题出在哪里。

    当使用 DBUnit 处理不同的数据库时,有时您需要设置数据库指定的配置。这是 MySql 的示例:

    IDatabaseConnection dbConn = getConnection();
    dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
        new MySqlDataTypeFactory());
    dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, 
        new MySqlMetadataHandler());
    

    MySql 中的目录/模式与其他数据库有些不同,所以如果你不使用MySqlMetadataHandler,你永远找不到正确的表。

    如果你想让JdbcDatabaseTester与MySql配合,你可以像这样扩展它并覆盖getConnection()方法:

    public class MySqlDatabaseTester extends JdbcDatabaseTester {
    
      ...   
    
      @Override
      public IDatabaseConnection getConnection() throws Exception {
        IDatabaseConnection dbConn = super.getConnection();
        dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
            new MySqlDataTypeFactory());
        dbConn.getConfig().setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, 
            new MySqlMetadataHandler());
        return dbConn;
      }
    }
    

    或者在您的测试用例中直接使用MySqlConnection 作为IDatabaseConnection

    【讨论】:

      【解决方案3】:

      在数据集文件夹中添加 dbunit.yml 文件。并设置下一个属性:

      caseInsensitiveStrategy: !!com.github.database.rider.core.api.configuration.Orthography 'LOWERCASE'
      properties:
        caseSensitiveTableNames: false
      

      它会禁用区分大小写的选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多