2015-11-04 80 views
0

我正在爲我的DAO服務編寫集成測試。我通過使用dao插入方法執行該操作,然後從數據庫中讀取對象並使用原始對象聲明所有字段。在測試中聲明java.util.Date字段

我想使用assertj-core來做出斷言。特別是isEqualToComparingFieldByField

但java.util.Date字段存在問題。它們返回相同的getTime()值,但不相等。

目前,我忽略了isEqualToComparingFieldByField斷言中的這些字段,然後用hasSameTimeAs方法comapre。

assertThat(object).isEqualToIgnoringGivenFields(other, "time"); 
assertThat(object.getTime()).hasSameTimeAs(other.getTime()); 

是任何方式,以提供定製的比較器,以isEqualToComparingFieldByField方法對於給定的類型(在這種情況下java.util.Date)或任何其他溶液通過字段避免此問題斷言兩個對象場?

+0

直到java 8日期/時間類,考慮基於'getTime()'的'java.util.Date'的平等,以及其他目的(字段)測試日曆。在Date中,相應的「field」構造函數已被棄用,並建議使用Calendar。 –

回答

0

如果你從sql獲取對象,那麼就是混合了時間戳和日期。

Date date = theTwoTowers.getReleaseDate(); 
java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime()); 

// timestamp is a Date, it can be compared to date 
assertThat(date.equals(timestamp)).isTrue(); 

// as date is not a Timestamp, it can't be equal to timestamp 
assertThat(timestamp.equals(date)).isFalse(); 

此鏈接可以幫助您:https://github.com/joel-costigliola/assertj-core/issues/273

+0

我已經看過這個對話,但它沒有說我該如何解決我的問題。是否有任何選項通過isEqualToComparingFieldByField方法(例如, hasSameTimeAs?我想避免僅爲java.util.Date字段編寫單獨的斷言。 – IgorekPotworek

+0

我不認爲這個問題已經寫入assertJ問題。 isEqualToComparingFieldByField可以被覆蓋:如果對象的元素是Date,那麼對於相等性你會做不同的事情,但是對於AssertJ的未來發展/變化是非常危險的。 另一種做你想做什麼的方法是創建一個ObjectA,所以你有YourActualObject = ObjectA + Date.You然後可以使用isEqualToComparingFieldByField作爲你的對象B並單獨檢查你的Date。 –

+0

我在我的問題中附加了類似的解決方案:assertThat(object).isEqualToIgnoringGivenFields(other,「time」); assertThat(object.getTime())。hasSameTimeAs(other.getTime());那麼沒有其他「好」的解決方案? – IgorekPotworek

1

沒有「的場場」,在指定自定義比較對於給定的字段類型比較的方式 - 我不知道有一個優雅的在AssertJ中介紹(但我想證明是錯誤的)。

你可以做的是定義一個比較爲對象,並使用它像這樣:

​​

一個完整的工作示例見assertj-examples項目。

我知道這需要編寫比較器的工作,但要完全控制所使用的比較策略,需付出代​​價。

+0

所以,如果AssertJ不支持這種問題,你能推薦我另一個測試/斷言庫,我可以在字段之間逐個比較兩個對象(包括提到的日期問題)嗎? – IgorekPotworek

+0

你可以嘗試單元(http://www.unitils.org/tutorial-reflectionassert.html),我也不知道它是否具有你期望的功能。 –