java - Assert.assertEquals(object 1, object2) 如何比较两个对象?

标签 java junit

Assert.assertEquals(Object1, Object2) 如何比较两个对象?

在java中,当使用Object1.equals(object2)比较object1和object2时,即使对象的内容相同,它们也不相等。

就好像您比较 String1.equals(String2) 一样,即使它们是不同的对象,这也会将两个字符串显示为相同。

String a = "hi there";
String b = "hi there";
a.equals(b) returns true


JSONObject j1 = (new JSONObject()).put("a","hi there");
JSONObject j2 = (new JSONObject()).put("a","hi there");
j1.equals(j2) does not return true;

问)为什么对象不转换为二进制流,然后比较检查它们是否相同?

q) Assert.assertEquals(j1,j2):断言失败。为什么?

最佳答案

你混淆了不同的想法。

一个概念被称为身份:两个引用是否指向同一个对象,即同一 block 内存?这就是 == 测试的内容,如 x == y 中,其中 x 和 y 是引用变量(指针)而不是基元。

Object 类上的 .equals 方法具有不同的意图。该方法询问两个对象的含义是否相同。该方法判断两个对象的内容是否显着相同。在某些情况下,“显着”意味着每个字段的每个值完全相同。这到底意味着什么取决于从 Object 继承的特定子类。无论谁编写 equals 的实现,都可以决定两个对象之间应该比较什么。

说到比较二进制流,首先,对象没有二进制流。此外,甚至两段文本也可以具有相同的含义,但其位有所不同——只需查找 Unicode Normalization 即可。或者甚至更简单的情况,在某些情况下,如果我们选择忽略大写与小写,则两段文本可能被认为是等效的,例如: DogdogDOG 可能所有三个都被认为是相同的,但每个都带有不同的八位位组。

上下文就是一切。

In java, when you compare object1 and object2 using Object1.equals(object2), they are not equal even though the content of the object is same.

您的陈述根本无法针对所有类别进行。您必须查看每个类的 equals 实现。类 Foo 可能会比较对象中的最后一个状态,而类 Bar 可能会选择仅比较类型为 UUID 的单个 id 字段,而忽略其所有其余字段中的值。

Assert.assertEquals(j1,j2): assertion fails. why ?

我不知道。我必须查找 Javadoc,以了解相关特定类(在您的情况下为 JSONObject)的 Object::equals 方法重写的实现。

重点是,必须为每次比较查找equals 方法文档。

同样,请务必为您实现的每个 equals 方法重写编写清晰的文档。

关于java - Assert.assertEquals(object 1, object2) 如何比较两个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57344311/

相关文章:

java - 何时在 Mockito 中使用 when()

java - Win7 x64 蓝湾

java - 在 webelement 上获取 NoSuchElementException (找到相同的 webelement,但有时我得到异常)

java - 如何在java spark中解析json请求

java - 创建 jar 文件时注意依赖关系

java - 适用于 JUnit 的便捷 Java 图像查看器

java - jUnit4.0 : how to know current test method name?

java - 如何在 JUnit 测试中使用 ExpectedException 验证生产代码中的断言错误

java - android: Facebook SDK AsyncTask 错误

java - 启动eclipse平台进行junit测试时出现异常