2016-03-22 88 views
2

我想測試一個LoginPresenter,我正在使用Mockito進行模擬。 Mockito不讓我verify在SUT上的方法調用,所以我不得不嘲笑它的依賴關係和verify他們的方法已被LoginPresenter調用。如何告訴被測試者使用模擬而不是自己的變量

我到了以下情況:

LoginPresenter有一個名爲attemptLogin方法:

private void attemptLogin(String username, String password) { 
    new LoginNetworkOperation(username, password).execute(); 
} 

我嘲笑LoginNetworkOperation和使用的Mockito,verify方法調用上​​。

@Test 
public void testWhenUserNameAndPasswordAreEnteredShouldAttemptLogin() throws Exception { 
    LoginView loginView = Mockito.mock(LoginView.class); 
    LoginNetworkOperation loginNetworkOperation = Mockito.mock(LoginNetworkOperation.class); 
    Mockito.when(loginView.getUserName()).thenReturn("George"); 
    Mockito.when(loginView.getPassword()).thenReturn("aaaaaa"); 
    loginPresenter.setLoginView(loginView); 
    loginPresenter.onLoginClicked(); 
    Mockito.verify(loginNetworkOperation.execute()); 
} 

但是,我怎麼做LoginPresenter使用嘲笑LoginNetworkOperation,而不是它會在attemptLogin方法之一?我需要將LoginPresenter的設計更改爲使用成員變量,併爲其提供一個setter,這是次優的,因爲方法中的局部變量很多,因爲它僅在那裏使用。

我對這件事情做錯了嗎?

起初,我想驗證LoginPresenterattemptLogin叫,但的Mockito只能驗證嘲笑對象的方法,我不能LoginPresenter間諜,因爲這是最後(通過AndroidAnnotations生成)

+0

你可能看看這個答案:http://stackoverflow.com/questions/10585490/androidannotations-and-unit-testing#10621419 –

回答

1

我找到了答案在這個視頻: https://www.youtube.com/watch?v=wEhu57pih5w

最大的外賣是:不與業務邏輯 這意味着不要實例的方法或構造函數的對象(可能使用DI代替)混合對象創建邏輯,BEC因爲測試代碼無法確定每當SUT的構造函數或方法被調用時鏈式反應開始的時間,這個關鍵字綁定到new

這意味着,在我的情況下,LoginPresenter不應該負責創建LoginNetworkOperation對象,但應該把它從外面

這樣,我就可以告訴它使用的模擬,而不是具體實施,因此,我將能夠做我的測試

相關問題