我正在为我的DAO服务编写集成测试。我通过使用dao insert方法执行该操作,然后从数据库中读取对象并使用原始对象断言所有字段。
我想使用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 :(得分:1)
在“逐场”比较中无法为给定的字段类型指定自定义比较器 - 我不确定在AssertJ中是否有优雅的介绍(但我希望被证明是错误的)
你可以做的是为你的对象定义一个比较器,并像这样使用它:
assertThat(frodo).usingComparator(raceNameComparator).isEqualTo(pippin);
请参阅assertj-examples项目以获取完整的工作示例。
我知道编写比较器需要工作,这是为了完全控制所使用的比较策略而付出的代价。
答案 1 :(得分: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