Java的assertEquals方法是否可靠?

时间:2009-07-29 17:47:35

标签: java string junit junit4

我知道==在比较两个Strings时会遇到一些问题。似乎String.equals()是一种更好的方法。好吧,我正在进行JUnit测试,我倾向于使用assertEquals(str1, str2)。这是断言两个字符串包含相同内容的可靠方法吗?我会使用assertTrue(str1.equals(str2)),但是你没有看到失败时预期和实际值的好处。

在相关的说明中,是否有人链接到明确解释str1 == str2问题的页面或线程?

7 个答案:

答案 0 :(得分:262)

在比较Java中的.equals()时,您应始终使用Strings

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

因此,使用assertEquals(string1, string2)绝对安全。 (因为String s是Object s)

Here is a link to a great Stackoverflow question关于==.equals()之间的一些差异。

答案 1 :(得分:30)

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

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

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

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

答案 2 :(得分:7)

简而言之 - 您可以拥有两个包含相同字符但是不同对象(在不同内存位置)的String对象。 ==运算符检查两个引用是否指向同一个对象(内存位置),但equals()方法检查字符是否相同。

通常,您有兴趣检查两个字符串是否包含相同的字符,而不是它们是否指向相同的内存位置。

答案 3 :(得分:3)

是的,它一直用于测试。测试框架很可能使用.equals()进行比较,例如这些。

下面是解释“字符串相等错误”的链接。本质上,Java中的字符串是对象,当您比较对象相等时,通常会根据内存地址而不是内容来比较它们。因此,两个字符串不会占用相同的地址,即使它们的内容相同,也不会正确匹配,即使它们在打印时看起来相同。

http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/

答案 4 :(得分:3)

public class StringEqualityTest extends TestCase {
    public void testEquality() throws Exception {
        String a = "abcde";
        String b = new String(a);
        assertTrue(a.equals(b));
        assertFalse(a == b);
        assertEquals(a, b);
    }
}

答案 5 :(得分:3)

JUnit assertEquals(obj1, obj2)确实呼叫obj1.equals(obj2)

assertSame(obj1, obj2)还有obj1 == obj2 obj1(即,验证obj2和{{1}}是否引用相同的实例),这是什么你试图避免。

所以你没事。

答案 6 :(得分:0)

  

==运算符会检查两个Objects是否完全相同Object。”

http://leepoint.net/notes-java/data/strings/12stringcomparison.html

String是java中的Object,因此属于比较规则类别。