断言Test中的java.util.Date字段

时间:2015-11-04 16:26:36

标签: java testing assertj

我正在为我的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)或任何其他解析两个对象的字段,以避免此问题?

2 个答案:

答案 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