Java的assertEquals方法可靠吗?

2022-08-31 06:03:30

我知道在比较两个时有一些问题。这似乎是一个更好的方法。好吧,我正在做JUnit测试,我的倾向是使用.这是断言两个字符串包含相同内容的可靠方法吗?我会使用 ,但是这样您就无法获得查看失败时预期值和实际值的好处。==StringsString.equals()assertEquals(str1, str2)assertTrue(str1.equals(str2))

在相关的说明中,是否有人有指向页面或线程的链接,可以清楚地解释问题?str1 == str2


答案 1

在 Java 中进行比较时,应始终使用。.equals()Strings

JUnit 调用该方法以确定方法 中的相等性。.equals()assertEquals(Object o1, Object o2)

因此,使用绝对是安全的。(因为 s 就是 s)assertEquals(string1, string2)StringObject

这里有一个链接,指向一个伟大的Stackoverflow问题,关于 和 之间的一些差异。==.equals()


答案 2

assertEquals使用方法进行比较。有一个不同的断言 ,它使用运算符。equalsassertSame==

要理解为什么不应该与字符串一起使用,您需要了解它的作用:它执行身份检查。也就是说,检查是否和引用同一对象。它被内置到语言中,它的行为不能被不同的类改变。另一方面,该方法可以被类重写。虽然它的默认行为(在类中)是使用运算符执行标识检查,但许多类(包括 )会覆盖它以执行“等效”检查。在 的情况下,不是检查 是否和引用同一个对象,而是检查它们引用的对象是否是包含完全相同字符的字符串。====a == babequalsObject==StringStringaba.equals(b)

类比时间:想象每个物体都是一张纸,上面写着一些东西。假设我有两张写着“Foo”的纸,另一张写着“Bar”的纸。如果我拿前两张纸来比较它们,它会回来,因为它本质上是在问“这些是同一张纸吗?它甚至不需要看纸上写的东西。事实上,我给它两张纸(而不是同一张纸两张)意味着它会返回 。但是,如果我使用,该方法将读取两张纸,并看到它们说同样的事情(“Foo”),因此它将返回 。String==falsefalseequalsequalstrue

与字符串混淆的一点是,Java具有“实习”字符串的概念,并且(有效地)自动对代码中的任何字符串文本执行。这意味着,如果代码中有两个等效的字符串文本(即使它们位于不同的类中),它们实际上都会引用同一个对象。这使得操作员返回的频率比预期的要高。String==true