2013-10-21 48 views
1

寫了一個簡單的junit/spring-test dbunit測試來測試我的jpa實體持久性。奇怪的事情發生。當DbUnit的比較我與@ExpectedDatabase集文件,它拋出異常比較喬達時間字段:春季測試dbunit比較失敗joda datetime字段

junit.framework.ComparisonFailure: value (table=person, row=2, col=birth_date) expected:<1973-11-2[7]> but was:<1973-11-2[6 23:00:00.0]> 
    at org.dbunit.assertion.JUnitFailureFactory.createFailure(JUnitFailureFactory.java:39) 
    at org.dbunit.assertion.DefaultFailureHandler.createFailure(DefaultFailureHandler.java:105) 
    at org.dbunit.assertion.DefaultFailureHandler.handle(DefaultFailureHandler.java:208) 
    at org.dbunit.assertion.DbUnitAssert.compareData(DbUnitAssert.java:524) 
    at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:409) 
    at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:253) 
    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:395) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:91) 
    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.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

我堅持「1973年11月27日」,但看到的DbUnit,作爲「1973年11月26日23:00:00.0 」。 (一小時前)。爲什麼?看起來像一個時區的東西。

這裏是我的測試類:

@Test 
    @ExpectedDatabase (value = "classpath:person-expected-data.xml") 
    public void testSavePersonEM() { 
     logger.info("--- testSavePersonEM ---"); 
     Person person = new Person("Joe", "King"); 
     person.setAddress("XXXX XXXXX 27"); 
     person.setEmail("[email protected]"); 
     person.setTelephone("123456789"); 

     person.setBirthDate(new DateTime("1973-11-27")); 

     em.persist(person); 
     assertEquals(new Long(2), person.getId()); 
     assertEquals("1973-11-27", person.getBirthDate().toString("yyyy-MM-dd")); 
     logger.info("new id:" + person.getId()); 
     logger.info("birthdate: " + person.getBirthDate().toString()); 
    } 

logger.info顯示 「1973年11月27日」。

這裏的人預期-data.xml中:

<dataset> 
    <Person id="2" first_name="joe" last_name="king" 
     birth_date="1973-11-27" address="bla bla 27" city="bla" 
     country="Serbia" email="[email protected]" telephone="123456798" /> 
</dataset> 

回答

0

OK,我從org.joda.time.DateTime改變實體的字段數據類型,以org.joda.time找到了解決辦法。 LOCALDATE的。此時我不在乎時間或時區。我只需要裸露的日期:

... 
@Column(name = "birth_date") 
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate") 
@DateTimeFormat(pattern = "yyyy-MM-dd") 
private **LocalDate** birthDate; 
... 

現在測試運行沒有問題。