2016-02-26 34 views
0

我正在編寫一個JUnit測試用例來比較兩個StringBuffers。 (該測試將檢查字符串逆轉。)JUnit在字符串和StringBuffer之間看到的不同行爲

@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,原稿);應該管用。

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

我不確定我是否誤解了一些基本的東西wrt String,StringBuffer和JUnit assertEquals。

感謝 阿米特

+0

'Question1_2.reverseString(orig)'什麼是'Question1_2'這個??在節目中? –

+0

Question1_2.reverseString(orig) - 它是我的類,用於反轉字符串..它只conatins邏輯扭轉字符串 – jaamit

回答

2

StringBuffer不覆蓋equals()方法。因此,它使用Object類的實現來檢查引用是否相等(檢查兩個對象是否爲相同)。

就你而言,兩個對象顯然都不相同(儘管它們的內容是相同的),因此它失敗了。

String另一方面覆蓋equals()方法並返回true如果兩個字符串的內容是相同的。

+0

感謝它解釋了這個問題。 :) – jaamit

0

回答是在第一表達

(ⅰ)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

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 :[email protected] 
Actual :[email protected] 

現在,如果我將obj1賦值給obj2,則兩個對象引用都指向相同的對象;看下面的例子,它將通過測試用例。

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