Путаница в типах столбцов в dbunit и создании dtd для наборов данных - PullRequest
0 голосов
/ 04 августа 2011

Буду признателен за помощь в использовании dbunit.Я использую postgresql9 в качестве базы данных.

Я создал настольную книгу с помощью инструмента hibernate hbm2ddl.

Я хотел создать несколько наборов xmldatasets для тестирования с помощью dbunit. Используя задачу ant DBUnit, я экспортировал значения из базы данных в dbinitialdataset.xml, который я очищаю и вставляю в базу данных перед каждым тестом. Удалив несколько строк, я создал ожидаемый dataset.xml.Если я хочу сравнить таблицу, созданную из db, с таблицей, созданной из ожидаемого dataset.xml, я думаю, что мне нужно определить dtd. Я использовал следующий код для создания dtd.

public static void createDTD(String dtdFileName) throws FileNotFoundException...{
        IDatabaseConnection connection = DbUnitUtils.createConnection();
        FlatDtdDataSet.write(connection.createDataSet(),new FileWriter("data/dbunit/"+dtdFileName));
        connection.close();
}
...
createDTD("myschema.dtd");

Созданный dtdприведено ниже

...
<!ELEMENT book EMPTY>
<!ATTLIST book
    book_id CDATA #REQUIRED
    isbn CDATA #REQUIRED
    book_name CDATA #REQUIRED
    publish_date CDATA #IMPLIED
    price CDATA #REQUIRED
    description CDATA #IMPLIED
    publisher_id CDATA #IMPLIED
    author_id CDATA #IMPLIED
>
...

Ожидаемый набор данных.xml выглядит следующим образом: Ожидаемый набор данных xml

Моя таблица postgres 'book' имеет вид

   Column    |          Type          | Modifiers 
--------------+------------------------+-----------
 book_id      | bigint                 | not null
 isbn         | character varying(255) | not null
 book_name    | character varying(255) | not null
 publish_date | date                   | 
 price        | real                   | not null
 description  | character varying(255) | 
 publisher_id | bigint                 | 
 author_id    | bigint                 | 
Indexes:
    "book_pkey" PRIMARY KEY, btree (book_id)
    "book_isbn_key" UNIQUE, btree (isbn)
Foreign-key constraints:
    "fk1f32e959a9fc15" FOREIGN KEY (author_id) REFERENCES author(author_id)
    "fk1f32e9b6bbf81f" FOREIGN KEY (publisher_id) REFERENCES publisher(publisher_id)

Что меня смущает, так это то, что поле publish_date (которое является типом даты в postgres), book_id (тип bigint), цена (реальный тип) также обрабатываются как CDATA. Как таблица, созданная из полей типа String, равнатаблица, полученная из базы данных, в которой есть поля, такие как Long, Date и т. д.?

В тестовом коде я пробовал

removeSomeRowsFromBookTable();
ITable actualBookTable = connection.createQueryTable("book", "select BOOK_ID,ISBN,...from BOOK");
IDataSet expectedDataSet = DbUnitUtils.createDataSet("expecteddataset.xml.xml");
ITable expectedBookTable = expectedDataSet.getTable("book");
Assert.assertEquals(expectedBookTable, actualBookTable);

Это вызывает AssertionFailedError.

Трассировка стека

junit.framework.AssertionFailedError: 

expected:<org.dbunit.dataset.DefaultTable@12d8ecd> 

but was:<org.dbunit.database.CachedResultSetTable@1fa5e5e>

at junit.framework.Assert.fail(Assert.java:47)
    at junit.framework.Assert.failNotEquals(Assert.java:282)
    at junit.framework.Assert.assertEquals(Assert.java:64)
    at junit.framework.Assert.assertEquals(Assert.java:71)
    at myapp.test.cascades.HibernateCascadeTests.testCascading(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:76)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:673)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:846)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1170)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.runWorkers(TestRunner.java:1147)
    at org.testng.TestRunner.privateRun(TestRunner.java:749)
    at org.testng.TestRunner.run(TestRunner.java:600)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:317)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:312)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:274)
    at org.testng.SuiteRunner.run(SuiteRunner.java:223)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1039)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:964)
    at org.testng.TestNG.run(TestNG.java:900)
    at org.testng.TestNG.privateMain(TestNG.java:1182)
    at org.testng.TestNG.main(TestNG.java:1146)

Что-то не так в том, что я делаюздесь? Должен ли я предоставить некоторую информацию о типах столбцов для элементов таблицы?Если кто-то может помочь мне решить эту проблему, было бы неплохо.

Класс DbUnitUtils для создания наборов данных

class DbUnitUtils {
    public static IDatabaseConnection createConnection(){
        ...
    }  
    public static IDataSet createDataSet(String file) throws DataSetException, IOException{
        return new FlatXmlDataSet(new File("data/dbunit/"+file));
    }
}

ps: я пробовал это с версиями dbunit-2.2.2 и 2.4.8 срезультаты те же .. Так что, должно быть, я упускаю что-то жизненно важное для правильной работы dbunit

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Ошибка произошла из-за того, что junit Assert не знает о равенстве классов Dbunit (ITable и т. Д.) И не работает в assertEquals () .. Я должен был использовать assertEquals() from dbunit's Assertion class.

такой простой упуск из виду основных фактов .. вызвал у меня пару дней горя

0 голосов
/ 04 августа 2011

Вы сравниваете сами объекты, а не их содержимое. Возможно, вы захотите взглянуть на что-то вроде EasyMock , которое действительно предназначено для такого рода тестирования. Также EasyMock поможет сломать зависимость от фактического использования базы данных.

...