簡體   English   中英

如何使用Mockito模擬和驗證方法中的回調

[英]How to mock and verify a callback in method using Mockito

在此方法中,我想模擬並確保當我不傳遞某些電子郵件字符串時調用mSharedPrefsManager

@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("certain@email.com"))
                    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("certain@email.com", welcomePresenter);
        verify(retrieveInteractor).buildRetrieveRequest(eq("certain@email.com"), any(RetrieveImpl.OnRetrieveCompletedListener.class));
        verify(sharedPrefsManager).storePoints(any(Integer.class));
        verify(welcomePresenter).updateSilhouette(any(MaitreBaseGson.class));
    }
}

你在嘲笑:

@Mock
RetrieveImpl retrieveInteractor;

這意味着,當您調用retrieveInteractor.buildRetrieveRequest(..) ,不會調用真正的實現,並且最終永遠不會調用您希望在該方法調用中調用的方法。

嘗試使用@Spy代替,這實際上將允許調用實際的實現,您還可以驗證該對象:

@Spy
RetrieveImpl retrieveInteractor;

只是一個方面..以為您在那兒測試太多了,並且會深入進行驗證。

我認為該測試應該針對RetrieveImpl.OnRetrieveCompletedListener類進行。 不在您的問題中。

但這只是我的味道。

RetrieveImpl與網絡交互時,嘗試使用@Spy對我造成了很多問題。

我改用Captor捕獲了回調。

@Captor
private ArgumentCaptor<RetrieveImpl.OnRetrieveCompletedListener> mOnRetrieveCompletedListenerCaptor;

...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM