2016-12-15 213 views
0

我想了解爲什麼添加等於正在使我的測試失敗。 我用一個簡單的類和測試重新創建了這個問題。JUnit Mockito測試失敗與等於

第一次測試通過,第二次測試失敗。

樣例類

public class Class { 

Map<String, Boolean> data = new HashMap<>(); 

public Map<String, Boolean> getData(boolean access) { 
    if (!access) 
     return null; 
    return data; 
}} 

測試類

public class ClassTest { 

@InjectMocks 
private Class testObj; 

@Test 
public void testGetDataNull() { 
    assertThat(testObj.getData(false), is(nullValue())); 
} 

@Test 
public void testGetDataNull2() { 
    assertThat(testObj.getData(false), is(equalTo(nullValue()))); 
}} 

失敗正顯示出此錯誤消息

Expected: is <null> 
    but: was null 

Q中的測試:什麼是它們之間的區別?

任何有識之士都非常感謝!

+0

我的猜測是,在第二次測試中,您實際上是在檢查_getData(false)_的結果是否等於由_nullValue()_生成的Matcher對象。嘗試使用* null *代替。 –

+0

請不要將您的班級命名爲「班級」。這會導致你所有的問題。 – nasukkin

回答

0

這是因爲nullValue()返回一個org.hamcrest.core.isNull對象。所以它不等於null,它是一個對象。但是,該對象包含一個matches方法,該方法只能匹配null,這就是爲什麼is有效。

順便說一句,這個測試應該可能只是讀assertNull(testObj.getData(false))

0

你的問題其實是關於Hamcrest,不是的Mockito。

你正在測試,如果實際值,即testObj.getData(false),這是null,等於由nullValue()返回的值,這是ISNULL()匹配的一個實例。 IsNull的一個實例不等於null,因此失敗。

我建議避免Hamcrest,在我看來,它更難以正確使用,並且比AssertJ更不優雅。

隨着AssertJ,你會寫

assertThat(testObj.getData(false)).isNull(); 

沒有靜態方法來猜測了,並且有效自動完成流暢的斷言來代替。