当前位置: 首页 > 面试题库 >

如何测试复杂对象图的相等性?

温成济
2023-03-14
问题内容

假设我有一个单元测试,想要比较两个复数对象是否相等。这些对象包含许多其他深层嵌套的对象。所有对象的类都有正确定义的equals()方法。

这并不困难:

@Test
public void objectEquality() {
    Object o1 = ...
    Object o2 = ...

    assertEquals(o1, o2);
}

麻烦的是,如果对象不相等,那么您得到的只是一个失败,没有迹象表明对象图的哪一部分不匹配。调试它可能会很痛苦且令人沮丧。

我当前的方法是确保一切都实现了toString(),然后像这样比较相等性:

    assertEquals(o1.toString(), o2.toString());

由于像Eclipse这样的IDE具有一个特殊的可视化比较器,用于显示失败测试中的字符串差异,因此这使跟踪测试失败更加容易。本质上,对象图以文本形式表示,因此您可以看到区别在哪里。只要toString()写得好,它就很棒。

不过,这一切都有些笨拙。有时您想要将toString()设计用于其他目的,例如记录,也许您只想呈现某些对象字段而不是全部对象,或者可能根本没有定义toString(),依此类推。

我正在寻找一种比较复杂的对象图的更好方法的想法。有什么想法吗?


问题答案:

您可以使用XStream将每个对象呈现为XML
,然后使用XMLUnit对XML进行比较。如果它们不同,那么您将获得上下文信息(以XPath,IIRC的形式),告诉您对象在哪里有所不同。

例如从XMLUnit文档:

Comparing test xml to control xml [different] 
Expected element tag name 'uuid' but was 'localId' - 
comparing <uuid...> at /msg[1]/uuid[1] to <localId...> at /msg[1]/localId[1]

注意,XPath指示不同元素的位置。

可能不是很快,但是对于单元测试来说可能不是问题。



 类似资料:
  • 编者按:此代码示例来自Rust 1.0之前的版本,并且在语法上是无效的Rust 1.0代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。 在下面的例子中,我们似乎无法测试平等性。为什么会这样?有解决办法吗?(我使用的是Rust 0.11)。

  • 问题内容: 为什么下面的代码打印? 问题答案: 为什么下面的代码打印? 因为执行比较 浅 。由于数组从中继承其-method ,将对内部数组执行同一性比较,这将失败,因为和均未引用 相同的 数组。 如果更改为它将按预期打印。

  • 考虑以下条件action(即,根据当前状态触发的操作): 异步 Action 下面异步Action怎么办? 要记住的是,如果我们遵循模式,我们的操作只是Angular服务上的函数。 所以我们可以模拟出NgRedux(和任何其他依赖项),就像测试其他Angular 2服务一样。

  • 本文向大家介绍如何判断两个对象相等?相关面试题,主要包含被问及如何判断两个对象相等?时的应答技巧和注意事项,需要的朋友参考一下 提供另一种写法: 当然JSON.stringify(obj)==JSON.stringify(obj)执行速度是最快的

  • 问题内容: 严格的相等运算符将告诉您两个对象 类型 是否相等。但是,有没有办法判断两个对象是否相等, 就像 Java中 的哈希码 值 一样 ? 与这个问题相似,但需要更多的学术答案。上面的场景演示了为什么必须要有一个,而我想知道是否有任何 等效的解决方案 。 问题答案: 简短的答案 简单的答案是:不,没有通用的方法可以确定一个对象是否与您所指的含义相等。例外是,当您严格考虑对象是无类型的时。 长答

  • 我有一个公司对象与不同的部门和员工。我已经成功地序列化了我的对象,并将它再次加载到我的程序中。 现在我想测试一下这两个对象在结构上是否相等。java是否为我提供了一个比较这些对象的工具? 我应该补充一点,我的对象有一个用其他对象填充的列表。 还是我必须为此编写自己的测试? 编辑: 现在我想比较一下t和t1,如果它们的值相同的话。