我有两个对象A
和B
。对象A
是我在JUnit测试期间得到的实际结果。对象B
是我做一个实际的结束数据库调用并假设按预期审查。我需要声明两个对象实例A
和B
在 value 中是相等的而不是实际对象。
我们在JUnit中有一个名为assertEquals(obj expected, obj actual)
的方法,但我不希望这样。
有没有办法或解决方法来实现同样的目标?
答案 0 :(得分:26)
想想你正在努力实现的目标。您想测试对象标识还是要验证两个对象是否具有完全相同的数据?根据你对assertEquals的建议,我猜你想要逐个领域。
如果对象很浅,可以使用
assertThat(actual, samePropertyValuesAs(expected));
当对象是复合时,这会失败。如果你想走完整个图表,你可以使用sameBeanAs匹配器,我们写了一些时间来解决这个问题:
assertThat(actual, sameBeanAs(expected));
如果你正在使用AssertJ,那么你也可以使用这样的内置功能:
assertThat(actual).isEqualToComparingFieldByField(expected);
您不想做的一件事情会覆盖equals
方法,因为将来可能会改变以满足业务需求。
答案 1 :(得分:10)
如果你想要深度平等,你可以使用Commons Lang3 EqualsBuilder#reflectionEquals()
:
Assert.assertTrue(EqualsBuilder.reflectionEquals(expected,actual));
答案 2 :(得分:4)
使用hamcrest,你可以断言这两个对象的每个成员!
e.g。 assertThat(actual).isEqualToComparingFieldByField(expected);
答案 3 :(得分:1)
assertEquals()
在您的对象上调用equals()
,并且没有办法解决这个问题。你可以做的是在你的班级中实施public boolean like(MyClass b)
之类的东西,你可以在其中比较你想要的任何东西。然后,您可以使用assertTrue(a.like(b))
检查结果。
答案 4 :(得分:1)
您需要覆盖班级的equals
和良好做法hashCode
方法。之后assertEquals(obj expected, obj actual)
将不会检查参考,但会使用您在equals
方法中实现的逻辑。