我很感激使用dbunit的一些帮助。 我使用postgresql9作为db。
我使用hibernate的hbm2ddl工具创建了表格。
我想用dbunit创建一些xmldatasets进行测试。使用ant DBUnit任务我将db的值导出到a initialdataset.xml,我在每次测试之前清理插入到db。删除一些行,我创建了一个expecteddataset.xml。如果我要比较从db创建的表 使用从expecteddataset.xml创建的表,我想我需要定义一个dtd.I使用以下代码来创建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
>
...
expecteddataset.xml就像这样 - expecteddataset 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类型的字段构成的表等于从db中检索的表 字段有多长,日期等?
在testcode中我试过
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));
}
}
P.S: 我尝试使用dbunit-2.2.2和2.4.8版本,但结果相同......所以,我必须错过正确运行dbunit的重要内容
答案 0 :(得分:1)
错误是因为junit Assert
不知道Dbunit类(ITable
等)的相等性,并且在assertEquals()中失败了。我应该使用assertEquals() from dbunit's Assertion class
。
如此简单地忽略了基本事实......给我带来了几天的悲伤
答案 1 :(得分:0)
您正在比较对象本身而不是内容。您可能希望查看类似EasyMock的内容,这些内容非常适合此类测试。此外,EasyMock将帮助打破实际使用数据库的依赖性。