2012-05-17 3 views
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' 

Вопрос

Что означает эта ошибка? Что я делаю не так? Почему схема не указана?тест DbUnit терпит неудачу с NoSuchTableException, но существует таблица

Второй тест, который фактически проверяет таблицу, проходит. Этот тест, который должен просто протестировать базу данных, терпит неудачу. Все таблицы существуют до и после.

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 } 

ответ

1

See Here for similar problem

Я уверен, что вы также должны установить прецедентного чувствительный вариант. Бэкэнду БД может не понравиться запрос имени таблицы верхнего регистра!

+0

Сообщение об ошибке одно и то же, но обстоятельства разные. Я могу иметь четыре копии 'testTableNoChanges()' и только 'testDbNoChanges()' терпит неудачу. Я не уверен, что проблема с CLEAN.INSERT. – djeikyb

+0

Наличие нескольких экземпляров 'testTableNoChanges()' all pass также заставляет меня думать, что dbunit уважает случай моих таблиц. Я бы предположил, что это все в шапке для акцента. Тем не менее, я бы хотел попробовать аргумент, чувствительный к регистру, в dbunit, если вы можете указать на него. – djeikyb

+0

Вы бы хотели сделать что-то вроде: > DatabaseConfig config = connection.getConfig(); > config.setFeature (DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE); –

0

Пробуйте использовать JdbcDatabaseTester constructor that takes a schema as an argument.

+0

Если я правильно понимаю, в mysql схемы - это другой термин для баз данных. Поскольку имя базы данных 'cal', я добавил эту строку как аргумент схемы.Я также сказал dbunit быть чувствительным к регистру (см. Комментарии в ответе @Jis Ben). Ошибка - это то же самое, кроме 'null' теперь' cal'. – djeikyb

+0

Кроме того, когда я добавляю аргумент схемы, мои тесты таблицы начинают сбой. 'org.dbunit.DatabaseUnitRuntimeException: для построения допустимого оператора select требуется хотя бы один столбец. Невозможно загрузить данные для таблицы = test, cols = [], pk = [] ' – djeikyb

0

В настоящий момент у меня нет среды 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; 
    } 
} 

или просто использовать в качестве MySqlConnectionIDatabaseConnection в тестовом случае.

Смежные вопросы