2015-11-04 68 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),我也不知道它是否具有你期望的功能。 –