当前位置: 首页 > 知识库问答 >
问题:

如果没有equals方法,如何在两个类上断言相等?

弓泰
2023-03-14

假设我有一个没有equals()方法的类,它没有源代码。我想在该类的两个实例上声明相等。

我可以做多个断言:

assertEquals(obj1.getFieldA(), obj2.getFieldA());
assertEquals(obj1.getFieldB(), obj2.getFieldB());
assertEquals(obj1.getFieldC(), obj2.getFieldC());
...

我不喜欢这个解决方案,因为如果早期断言失败,我无法获得完全的平等性。

我可以自己手动比较并跟踪结果:

String errorStr = "";
if(!obj1.getFieldA().equals(obj2.getFieldA())) {
    errorStr += "expected: " + obj1.getFieldA() + ", actual: " + obj2.getFieldA() + "\n";
}
if(!obj1.getFieldB().equals(obj2.getFieldB())) {
    errorStr += "expected: " + obj1.getFieldB() + ", actual: " + obj2.getFieldB() + "\n";
}
...
assertEquals("", errorStr);

这给了我一幅完整的平等图,但很笨拙(我甚至没有考虑可能出现的空问题)。第三个选项是使用Comparator,但compareTo()不会告诉我哪些字段未通过相等。

有没有更好的实践可以从对象中得到我想要的东西,而不需要子类化和重写equals(呃)?

共有3个答案

司空鸿禧
2023-03-14

我通常使用org实现这个用例。阿帕奇。平民lang3。建设者等式生成器

Assert.assertTrue(EqualsBuilder.reflectionEquals(expected,actual));
濮嘉茂
2023-03-14

Mockito提供了一个反射匹配器:

对于最新版本的Mockito使用:

Assert.assertTrue(new ReflectionEquals(expected, excludeFields).matches(actual));

对于旧版本,请使用:

Assert.assertThat(actual, new ReflectionEquals(expected, excludeFields));
年风华
2023-03-14

这里有许多正确的答案,但我也想补充我的版本。这是基于Assertj。

import static org.assertj.core.api.Assertions.assertThat;

public class TestClass {

    public void test() {
        // do the actual test
        assertThat(actualObject)
            .isEqualToComparingFieldByFieldRecursively(expectedObject);
    }
}

更新:在Assertjv3中。13.2正如Woodz在评论中指出的那样,这种方法是不推荐的。目前的建议是:

public class TestClass {

    public void test() {
        // do the actual test
        assertThat(actualObject)
            .usingRecursiveComparison()
            .isEqualTo(expectedObject);
    }

}
 类似资料:
  • 因此,上述结构在ClassA中也同样存在。 假设我想编码2个其他类ClassC(使用ClassA的实例)和ClassD(使用ClassB的实例)。除了ClassA和ClassB的实例之外,ClassC和ClassD的代码完全相同。 从示例中可以看出,ClassC和ClassD具有相同的功能,但对tmp使用了不同的类

  • 我有类,它只使用id属性定义equals。它还有另一个方法(称为“are同”),它检查给定参数是否具有与此对象属性相等的一些重要属性(并且它忽略id)。 在测试中,我想检查两个集合是否使用arame as“custom equals”方法相同(最好忽略顺序,不依赖hashCode,这显然与arame不一致)。 我想知道,是否有比写包装纸更简单的方法。写这样的东西会更愉快 Hamcrest示例在处理

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

  • 我在Codewars.com参加培训测试, 说明是: 在此kata中,您必须在给定字符串的情况下,用字母在字母表中的位置替换每个字母。 如果文本中的任何内容不是字母,请忽略它,不要返回它。“A”=1,“B”=2. 我已经制作了这样的PHP脚本 但当我提交我的答案时,它包含的错误就像 请谁能帮忙修一下?告诉我为什么它显示错误的细节?

  • 问题内容: 我一直在四处张望,我至少找到了一个不清楚的答案。 我正在使用GUI构建一个非常基本的聊天应用程序,并且已经将GUI与连接对象分离了。现在,我需要在服务器类中从GUI调用一种方法,反之亦然。但是我不太了解如何做到这一点(即使使用“ this”也是如此)。这是一部分代码的样子(这是一个名为server_frame的类): 这是来自server_frame的代码,srv是另一个类(服务器)中

  • 更新 更准确地说。我想知道这两个列表是否有相同的对象,两个列表都没有额外的对象,顺序无关紧要。例如: