问题描述
是否有比较两个不同对象的最佳实践,例如两个 Dto,如果它们不同,则不会显示很长的结果,如果对象以某种方式复杂和嵌套,则很难找到不同的属性?
目前我看到一个很长的结果,很难或很麻烦地找到哪个特定的属性失败了。至少它使用了一个使用 Kotlin 的数据类。
在 IDE 中,例如如果对象更大或更复杂,您必须滚动查看完整比较。找出差异所在并不直观或容易。
在我看来,这会导致维护开销。
例如我可以看到使用 Kotest 这个不错的输出。为什么 junit5 assertEquals 方法无法做到这一点?
org.opentest4j.AssertionFailedError: data class diff for com.lennykey.Cat
├ name: expected:<"Catta"> but was:<"Catty">
├ favouritedish: expected:<"Tuna"> but was:<"Fish">
└ father: Expected null but actual was Cat(name=Father,color=orange,birthDay=1.01.1980,address=Street 1,favouritedish=Fish,mother=null,father=null)
expected:<Cat(name=Catta,favouritedish=Tuna,father=null)> but was:<Cat(name=Catty,father=Cat(name=Father,father=null))>
Expected :Cat(name=Catta,father=null)
Actual :Cat(name=Catty,father=null))
解决方法
不确定我是否正确解决了您的问题,但我会尽力回答:
假设:
- 您正在使用 IDE,这是 Idea
- 您正在使用 Java + jUnit5
- 您正在比较相同类型的两个对象,因此您覆盖了 equals()/hashCode()。
- toString() 被覆盖以提供一些有意义的输出。
让我们比较 Cat 类的两个对象:
public final class Cat {
private String name;
private int age;
}
测试:
@Test
public void compareCats() {
Cat cat1 = new Cat("Simple cat",15);
Cat cat2 = new Cat("Super cat",15);
Assertions.assertEquals(cat1,cat2);
}
让我们运行测试并查看结果:
让我们点击控制台输出中生成的“”链接:
因此在差异窗口中,您可以配置要突出显示差异的方式。您还可以轻松地从一个差异导航到另一个差异。