【问题标题】:JUnit, Comparing ObjectsJUnit,比较对象
【发布时间】:2012-06-14 07:49:51
【问题描述】:

我正在学习 JUnit,我知道 assertEquals() 调用 equals() 方法来比较对象......那么为什么下面比较两个 regex Pattern 对象的测试没有通过?

@Test
public void testTwoCompiledPattern()
{   
    assertEquals(Pattern.compile("test"), Pattern.compile("test"));
}

这个反而通过了:

@Test
public void testTwoCompiledPattern()
{   
    assertEquals(Pattern.compile("test").toString(), Pattern.compile("test").toString());
}

【问题讨论】:

  • 我认为出了点问题。我首先认为我们不应该检查是否创建了正确的模式。我宁愿检查传递给模式的字符串(如果您的代码生成它们)。你能分享一下你在这个特定的测试中检查了什么吗?
  • +1。那只是学习 JUnit 的测试,在实际情况下,我会按照您的建议检查字符串。

标签: java regex unit-testing testing junit


【解决方案1】:

这是因为当您调用 toString() 方法时,两者都返回“test”字符串,因为 Pattern 类覆盖了它。但是如果你只比较 Pattern 对象,它们是 2 个不同的对象,因此一个不等于另一个,即使它们具有相同的状态。

equals 方法检查引用是否相等。

【讨论】:

  • 谢谢。在这些情况下比较对象的最佳做法是什么? toString()?
  • 好吧,当有人这么说但“这取决于”时,您可能会讨厌。您必须检查 Java API 以了解哪些方法可以帮助您实现您想要的。在 Pattern 类案例中,有一个名为 pattern() 的方法,它返回编译 Pattern 对象的字符串正则表达式,在本例中为“test”,然后您可以比较它们。 (在这种情况下,pattern() 与 toString() 的作用相同)。但是当你有自己的类时,你可以重写 equals 方法来实现你自己的对象相等,但是你必须遵守某些规则。
【解决方案2】:

.equals of Pattern 对象检查两者是否引用同一个对象。

但是 String.equals 方法检查两个字符串是否相同(不是对象引用比较)

即为什么第二个通过了。

【讨论】:

  • 谢谢。简单的 Java 问题:一般来说,我如何知道 equals() 方法何时检查对象引用或内容?
  • 一般你不知道。唯一的方法是阅读方法/类的 JavaDoc,它应该描述内部行为。
【解决方案3】:

equals() 方法比较两个对象的哈希码。在前一种情况下,有两个不同的对象具有不同的哈希码,因此测试失败。在后一种情况下,有两个字符串“test”,它们具有相同的哈希码,因此测试通过。

【讨论】:

  • 并非如此,两个相等的对象必须给出相同的哈希码,但如果它们具有相同的哈希码,则它们不需要相等。所以 equals 方法比较参考值相等,而不是 hashcode 相等。在字符串的情况下,如果您有 2 个具有相同值的字符串引用,则它们隐式指向同一个字符串对象,这就是它们相等的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2018-12-12
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
相关资源
最近更新 更多