2017-02-13 208 views
2

在此方法中,我想模擬並確保mSharedPrefsManager在我不傳入某個電子郵件字符串時被調用。如何在使用Mockito的方法中模擬和驗證回調

@Override 
public void retrieveWithEmail(final String email, final WelcomeContract.Presenter presenter) 
{ 
    retrieveInteractor.buildRetrieveRequest(email, new RetrieveImpl.OnRetrieveCompletedListener() 
    { 
     @Override 
     public void onRetrieveCompleted(final MaitreBaseGson retrieveResponse, RetrieveImpl retrieveClass) 
     { 
      if (retrieveResponse.getStatus().equals(mContext.getString(R.string.ok))) 
      { 
       if (!email.equals("[email protected]")) 
        mSharedPrefsManager.storePoints(Integer.parseInt(retrieveResponse.getData().getPoints())); 
       presenter.updateSilhouette(retrieveResponse); 
      } 
      // Silently swallow failures 
     } 
    }); 
} 

但是,在我的測試中,我無法確定是否調用了mSharedPrefsManager。 Mockito說.storePoints()永遠不會被調用。我想過要做一個doReturn().when(),但因爲這是不可行的方法,是嗎?

如何捕獲sharedPrefsManager上的相互作用?

Mockito也說.updateSilhouette()不叫。我需要以某種方式模擬onRetrieveCompleted()

@RunWith(MockitoJUnitRunner.class) 
public class WelcomeInteractorTest 
{ 
    @Mock 
    RetrieveImpl retrieveInteractor; 

    @Mock 
    WelcomePresenter welcomePresenter; 

    @Mock 
    SharedPrefsManager sharedPrefsManager; 

    @Mock 
    Context context; 

    @InjectMocks WelcomeInteractorImpl welcomeInteractor; 

    @Mock 
    RetrieveImpl.OnRetrieveCompletedListener onRetrieveCompletedListener; 

    @Test 
    public void RetrieveWithCertainEmail_SavePoints() 
    { 
     welcomeInteractor.retrieveWithEmail("[email protected]", welcomePresenter); 
     verify(retrieveInteractor).buildRetrieveRequest(eq("[email protected]"), any(RetrieveImpl.OnRetrieveCompletedListener.class)); 
     verify(sharedPrefsManager).storePoints(any(Integer.class)); 
     verify(welcomePresenter).updateSilhouette(any(MaitreBaseGson.class)); 
    } 
} 
+0

你可以發佈你如何結束你的代碼? – Caique

回答

0

嘗試使用@Spy造成了很多的問題,我作爲RetrieveImpl與網絡進行交互。

我改爲使用Captor並捕獲回調。

@Captor 
private ArgumentCaptor<RetrieveImpl.OnRetrieveCompletedListener> mOnRetrieveCompletedListenerCaptor; 

... 

@Test 
public void isTest() 
{ 
    ... 
    verify(retrieveInteractor).buildRetrieveRequest(eq(email), mOnRetrieveCompletedListenerCaptor.capture()); 
    mOnRetrieveCompletedListenerCaptor.getValue().onRetrieveCompleted(mockMaitreBaseGsonSuccessful, retrieveInteractor); 
} 
0

你嘲諷:

@Mock 
RetrieveImpl retrieveInteractor; 

這意味着,當你調用retrieveInteractor.buildRetrieveRequest(..),真正實現不被調用,最終,你期望得到的是方法調用中調用的方法都不會被調用。 。

嘗試使用@Spy代替,這實際上允許真正落實到被調用,您可以驗證對象也:

@Spy 
RetrieveImpl retrieveInteractor; 

只有一方..在認爲你在測試太多,並深入你的驗證。

在我看來,測試應該爲RetrieveImpl.OnRetrieveCompletedListener類完成。不是你問題中的問題。

但是那只是我的口味..

+0

我的'RetrieveImpl'將'Context'作爲其構造函數的唯一參數,'Mockito'給我一個錯誤,說它需要一個0-arg構造函數。我可以以某種方式嘲笑'Context',還是需要遵循不同的方法? –

+1

添加一個默認構造函數,併爲上下文設置器。然後模擬上下文並使用setter注入RetrieveImpl –

相關問題