测试两个对象实例是否等于JUnit

时间:2014-12-22 15:35:11

标签: java junit

我有两个对象AB。对象A是我在JUnit测试期间得到的实际结果。对象B是我做一个实际的结束数据库调用并假设按预期审查。我需要声明两个对象实例AB value 中是相等的而不是实际对象。

我们在JUnit中有一个名为assertEquals(obj expected, obj actual)的方法,但我不希望这样。

有没有办法或解决方法来实现同样的目标?

5 个答案:

答案 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方法中实现的逻辑。