【发布时间】:2009-09-11 15:27:22
【问题描述】:
假设我有一个单元测试想要比较两个复杂对象的相等性。这些对象包含许多其他深度嵌套的对象。所有对象的类都正确定义了equals() 方法。
这并不难:
@Test
public void objectEquality() {
Object o1 = ...
Object o2 = ...
assertEquals(o1, o2);
}
问题是,如果对象不相等,你得到的只是失败,没有迹象表明对象图的哪一部分不匹配。调试它可能会很痛苦和令人沮丧。
我目前的方法是确保一切都实现toString(),然后像这样比较是否相等:
assertEquals(o1.toString(), o2.toString());
这使得跟踪测试失败变得更加容易,因为像 Eclipse 这样的 IDE 有一个特殊的可视比较器,用于显示失败测试中的字符串差异。本质上,对象图是以文本形式表示的,因此您可以看到差异在哪里。只要toString() 写得好,它就很好用。
不过,这有点笨拙。有时您想为其他目的设计 toString(),例如日志记录,也许您只想渲染一些对象字段而不是所有字段,或者根本没有定义 toString(),等等。
我正在寻找更好的方法来比较复杂对象图。有什么想法吗?
【问题讨论】:
-
+1 好你提出来了。我想看看其他人找到了哪些解决方案。
标签: java unit-testing