[英]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.