1

我正在为我的 DAO 服务编写集成测试。我通过使用 dao 插入方法然后从数据库中读取对象并使用原始对象断言所有字段来执行此操作。

我想使用 assertj-core 进行断言。特别是isEqualToComparingFieldByField

但是 java.util.Date 字段存在问题。它们返回相同的 getTime() 值但不相等。

目前我在 isEqualToComparingFieldByField 断言中忽略这些字段,然后与 hasSameTimeAs 方法比较。

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

是否有任何方法可以为给定类型(在本例中为 java.util.Date)提供自定义比较器到 isEqualToComparingFieldByField 方法或任何其他解决方案来逐字段断言两个对象以避免此问题?

4

2 回答 2

2

无法在“逐个字段”比较中为给定字段类型指定自定义比较器 - 我不确定在 AssertJ 中引入它是否优雅(但我希望被证明是错误的)。

您可以做的是为您的对象定义一个比较器,并像这样使用它:

assertThat(frodo).usingComparator(raceNameComparator).isEqualTo(pippin);

有关完整的工作示例,请参阅assertj-examples项目。

我知道编写 Comparator 需要工作,这是完全控制所使用的比较策略的代价。

于 2015-11-06T22:45:01.890 回答
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

于 2015-11-04T16:38:57.930 回答