2017-09-16 574 views
1

我正在學習如何在android studio中進行單元測試。如下所示,我有一個名爲「isValidUrl」的方法,在下面的測試部分中,我使用Mockito編寫了該方法的測試 ,但測試總是失敗。如何測試方法在Mockito中返回布爾值

你可以請幫忙,並指導我如何測試這種方法?

代碼

public boolean isValidUrl(String url) { 
    return (url != null && !url.equals("")) ? true : false; 
} 

測試

public class ValidationTest { 
@Mock 
private Context mCtx = null; 

@Before 
public void setUp() throws Exception { 
    mCtx = Mockito.mock(Context.class); 
    Assert.assertNotNull("Context is not null", mCtx); 
} 

@Test 
public void isValidUrl() throws Exception { 
    Validation validation = new Validation(mCtx); 
    String url = null; 
    Mockito.when(validation.isValidUrl(url)).thenReturn(false); 
} 

}

回答

1

因爲你想嘲笑 '真正的' 對象的行爲你得到一個異常(validation)。

你需要分開兩件事:嘲弄斷言

懲戒方法創建一個類的「假」的對象(比如你Context所做的那樣),並在測試之前確定自己的行爲。 在你的情況

Mockito.when(validation.isValidUrl(url)).thenReturn(false); 

手段,你告訴validation對象返回false如果isValidUrl(url)被調用。儘管你只能用嘲弄的對象來做到這一點,但在你的情況下,無論如何都沒有意義,因爲你想測試你的類的「真實」行爲,而不是模擬對象的行爲。 Mocking方法通常用於定義類的依賴關係的行爲,在這種情況下,還是Context。 爲了您的測試在這裏,這不是必要的。

聲明然後做測試類應該如何表現的實際「測試」。

你想測試isValid()urlnull返回false:

Assert.assertEquals(validation.isValid(null), false); 

或更短:

Assert.assertFalse(validation.isValid(null)); 

您可以使用assertEqualsassertFalseassertTruesome others驗證您的isValid()方法返回您希望它返回給定url參數的內容。

+0

謝謝你的答案..但我可以在同一個方法中使用多個斷言..因爲我想測試isValid(null),isValid(true)和isValid(false) – user2121

+0

@ user2121是的,你可以。這是一個有趣的問題,大多數人會建議你爲每種情況做一個額外的測試方法,但是你也可以在一種測試方法中進行儘可能多的斷言。 – FWeigl

+0

謝謝..我在這裏發佈了另一個與測試有關的問題:https:// stackoverflow。com/questions/46262467/how-to-test-picasso-using-unit-test-and-mockito也許你想看看,你的答案對我來說是一個指導性的線索,因爲我是學習測試單位 – user2121