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

thi*_*ain 29 java junit

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

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

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

tdd*_*key 33

想想你正在努力实现的目标.您想测试对象标识还是要验证两个对象是否具有完全相同的数据?根据你对assertEquals的建议,我猜你想要逐场进行.

如果物体很浅,你可以使用

assertThat(actual, samePropertyValuesAs(expected));
Run Code Online (Sandbox Code Playgroud)

但是,当对象是复合时,这会失败.如果你想遍历整个图形,你可以使用sameBeanAs匹配器,我们写了一些时间来解决这个问题:

assertThat(actual, sameBeanAs(expected));
Run Code Online (Sandbox Code Playgroud)

如果你正在使用AssertJ,那么你也可以使用这样的内置功能:

assertThat(actual).isEqualToComparingFieldByField(expected);
Run Code Online (Sandbox Code Playgroud)

有一件事你不想这样做会覆盖这个equals方法,因为将来可能会改变以适应业务需求.

  • 如果对象中有对象,请使用assertThat(actual).isEqualToComparingFieldByFieldRecursively(expected). (3认同)
  • 您知道我们可以使用的任何Hamcrest匹配器吗? (2认同)
  • SamePropertyValuesAs 是内置的 Hamcrest 匹配器。SameBeanAs 是我们在 Shazam 编写的自定义 Hamcrest 匹配器,旨在解决这个问题 (2认同)
  • 由于“isEqualToComparingFieldByField”现已弃用,请参阅“usingRecursiveComparison”,例如:“assertThat(actual).usingRecursiveComparison().isEqualTo(expected);” (2认同)

acd*_*ior 11

如果你想要深度平等,你可以使用Commons Lang3 EqualsBuilder#reflectionEquals():

Assert.assertTrue(EqualsBuilder.reflectionEquals(expected,actual));
Run Code Online (Sandbox Code Playgroud)


aur*_*ius 10

使用assertj,您可以断言这两个对象的每个成员!

例如assertThat(actual).isEqualToComparingFieldByField(expected);

  • 不能用这个。Hamcrest 的assertThat 接受两个参数。 (3认同)