为什么即使没有对数据库进行任何更改,JUnit测试也可能失败

时间:2017-09-28 13:20:17

标签: java spring junit dbunit

所以我现在正在使用Java和Junit测试。我还使用DbUnit进行方便的数据库设置和拆卸。我拥有超过40个桌子的海量数据库。

为了简化我尝试使用

拆除我的数据库
[...]
@DatabaseTeardown("classpath:/emptyDb.xml")
public MyClassTest

我的emptyDb.xml包含数据库中每个表的空行,如:

<dataset>
    <database.table1 />
    <database.table2 />
    ...
    <database.tableN />
</dataset>

我还为数据init创建了类似的文件,只是行不空。我们称之为initDb.xml并且我遇到了非常奇怪的行为,我的测试方法甚至失败了,通过它不应该。我的测试用例如下:

@Test
@DatabaseSetup("classpath:/initDb.xml")
@ExpectedDatabase("classpath/initDb.xml") // yes I'm using the same file on purpose
public void myTest()
{} // empty method body is part of a test here

根据我的理解,这个简单的测试应该总是成功,但情况是,它失败了,错误跟踪看起来像这样:

junit.framework.ComparisonFailure: table count expected:<4[1]> but was:<4[8]>
    at org.dbunit.assertion.JUnitFailureFactory.createFailure(JUnitFailureFactory.java:39)
    at org.dbunit.assertion.DefaultFailureHandler.createFailure(DefaultFailureHandler.java:105)
    at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:237)
    at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:205)
    at org.dbunit.Assertion.assertEquals(Assertion.java:104)
    at com.github.springtestdbunit.assertion.DefaultDatabaseAssertion.assertEquals(DefaultDatabaseAssertion.java:33)
    at com.github.springtestdbunit.DbUnitRunner.verifyExpected(DbUnitRunner.java:115)
    at com.github.springtestdbunit.DbUnitRunner.afterTestMethod(DbUnitRunner.java:67)
    at com.github.springtestdbunit.DbUnitTestExecutionListener.afterTestMethod(DbUnitTestExecutionListener.java:158)
    at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:406)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:90)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

任何可能导致此类行为的建议?我正在寻找解决方案,似乎数据库表肯定有问题,但我无法找到解决方案。

<小时/> 更新
问题仅适用于严格的断言模式

0 个答案:

没有答案