1

エラー

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'

質問

このエラーはどういう意味ですか? 私は何を間違っていますか?スキーマが null なのはなぜですか?

テーブルを実際にテストする 2 番目のテストに合格します。データベースをテストするだけのはずのこのテストは失敗します。テーブルはすべて前後に存在します。

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

ソース

これは便利なスニペットだと思いますが、すべては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 }
4

3 に答える 3

1

同様の問題については、こちらをご覧ください

大文字と小文字を区別するオプションも設定する必要があると確信しています。DBバックエンドは、大文字のテーブル名の要求を好まない可能性があります。

于 2012-05-17T19:03:09.053 に答える
1

現時点で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と正しいテーブルを見つけることはできません。

JdbcDatabaseTesterMySql と連携させたい場合は、次の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;
  }
}

または単にテストケースのように使用しますMySqlConnectionIDatabaseConnection

于 2012-05-19T20:16:22.293 に答える