2013-05-26 24 views
1

我想比較兩個字符串使用assertEquals(s1,s2); 我收到比較錯誤<> null預計在它。 幫我解決這個問題。什麼是比較失敗,JUnit中預期爲null?

+2

哪裏是代碼? –

+0

使用調試器來確保兩個字符串都是非空的。或者在測試之前打印出值。 – Marvo

+0

是否有可能使用unicode字符,如[在這裏](http://stackoverflow.com/questions/4237581/comparing-unicode-characters-in-junit)? –

回答

5

(你不說你使用的是什麼版本的JUnit,它可能關係......雖然可能不是)

這意味着,單元測試的表達式的計算結果爲null,作爲assertEquals的參數expected,並且actual參數不計算爲null

如果不查看代碼,這是不可能的,但它可能是單元測試中的錯誤(例如,圍繞錯誤方式的參數)或代碼中的錯誤。 。 或兩者。至於爲什麼你得到一個null,這取決於單元測試和/或它正在測試的代碼。您需要通過查看源代碼,使用調試器等來進行自己的調查。

注意,assertEquals方法(見下文)比較了使用equals(未==)對象和需要小心以避免拋出NPE它的一個或兩個參數是null。所以那些建議你首先測試null的人沒有提到這一點。

這裏的JUnit 4.4的代碼:

static public void assertEquals(String message, Object expected, Object actual) { 
    if (expected == null && actual == null) 
     return; 
    if (expected != null && isEquals(expected, actual)) 
     return; 
    else if (expected instanceof String && actual instanceof String) { 
     String cleanMessage= message == null ? "" : message; 
     throw new ComparisonFailure(cleanMessage, (String)expected, 
            (String)actual); 
    } 
    else 
     failNotEquals(message, expected, actual); 
    } 
} 

private static boolean isEquals(Object expected, Object actual) { 
    return expected.equals(actual); 
} 

正如你所看到的,null案件處理...

0

JUnit調用.equals()方法來確定方法assertEquals(Object o1,Object o2)中的相等性。所以,你絕對安全使用assertEquals(string1,string2)。 (因爲字符串是對象)提供的對象都是非空的。評估它的另一種方法是使用assertTrue:

assertTrue(s1.equals(s2)); 
+5

實際上,建議使用assertEquals而不是assertTrue來檢查斷言失敗時兩個對象作爲消息的相等性是否更容易解釋。 –

+1

這個陳述也是有問題的:*「assertEquals檢查對象是否相等,比較字符串與平等不是一個好主意」*。事實上,'assertEquals'使用'Object.equals' ...並且這是比較字符串的正確方法**。 (它不使用'=='...讀取代碼和javadocs。)。如果你實際上在談論使用'assertTrue'的正確方法:1)這並不明顯,2)'assertTrue'是一個紅鯡魚,'因爲他沒有使用它,3)這是一個壞主意;請參閱Pangea的評論。 –