JUnit在String和StringBuffer之间看到不同的行为

时间:2016-02-26 04:46:05

标签: java junit

我正在编写一个JUnit测试用例来比较两个StringBuffers。 (测试将检查字符串反转。)

@Test
public void testReverseString() {
    StringBuffer orig = new StringBuffer("fedcba");
    StringBuffer exp  = new StringBuffer("abcdef");
    // function will reverse the string so 
    // orig will be "abcdef" after the call
    Question1_2.reverseString(orig);        
    //System.out.println(exp + " " + orig); // output - abcdef abcdef
    //assertEquals(exp.toString(), orig.toString()); This Passes
    //assertEquals(exp, orig);                       This FAILS
    //assertTrue(exp.equals(orig));                  This FAILS
}

根据这个JUnit to test for StringBuffers assertEquals(exp,orig);应该工作。

assertEquals(exp.toString(), orig.toString()); This Passes
//assertEquals(exp, orig);                       This FAILS
//assertTrue(exp.equals(orig));                  This FAILS

我不确定我是否误解了一些基本的东西,包括String,StringBuffer和JUnit assertEquals。

由于 阿米特

3 个答案:

答案 0 :(得分:2)

StringBuffer不会覆盖equals()方法。因此,它使用Object类的实现来检查引用相等性(检查两个对象是否都是相同)。

在你的情况下,两个对象显然不一样(虽然它们的内容是相同的),因此它失败了。

另一方面,

String会覆盖equals()方法,如果两个字符串的内容相同,则返回true

答案 1 :(得分:0)

在First Expression中答案很简单

(i)assertEquals(exp.toString(), orig.toString());传递String对象作为参数。 assertEquals重载了String类。因此,它将接受它作为String并检查值的相等性。所以,这将通过测试。

(ii)assertTrue(exp, orig);这里传递StringBuffer对象作为参数assertEquals没有超载StringBuffer类。因此,它将接受它作为Object并检查引用相等而不是值。因此,这将在测试期间引发异常。

(iii)assertEquals(exp.equals(orig));在这里,您使用的equals方法实际上属于对象类而不是StringBuffer。 。所以,再次它将检查引用相等而不是值。所以,这将使测试失败,因为两个对象都指的是不同的Object

答案 2 :(得分:0)

assertEquals(exp,orig);基本上是比较两个对象的引用。如您所知,在内存中,两个对象都是使用唯一引用ID单独创建的,这就是测试用例失败的原因。

请参阅以下代码及其输出:

@Test
    public void equal()
    {
        TestClass obj1= new TestClass();
        TestClass obj2= new TestClass();
        Assert.assertEquals(obj1,obj2);
    }

以下是输出,您可以在其中清楚地看到作为内存引用的预期和实际结果。

java.lang.AssertionError: 
Expected :com.company.TestClass@6c20cbef
Actual   :com.company.TestClass@5d2cef5e

现在,如果我将obj1分配给obj2,那么两个对象引用都指向同一个对象;请参阅以下示例,该示例将通过测试用例。

@Test
    public void equal()
    {
        TestClass obj1= new TestClass();
        TestClass obj2;
        obj2= obj1;
        Assert.assertEquals(obj1,obj2);
    }