在这种方法中,我想模拟并确保当我不传入某个电子邮件字符串时调用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
。莫米托说,.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));
}
}
尝试使用@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);
}
你在嘲笑:
@Mock
RetrieveImpl retrieveInteractor;
这意味着当您调用 retrieveInteractor.buildRetrieveRequest(..)
时,不会调用真正的实现,并且最终永远不会调用您希望在该方法调用中调用的方法。
尝试改用@Spy,这实际上将允许调用真正的实现,并且您还可以验证该对象:
@Spy
RetrieveImpl retrieveInteractor;
只是一方面......认为你在那里测试太多,并深入你的验证。
在我看来,应该对 RetrieveImpl.OnRetrieveCompleteListener 类进行测试。不是你问题中的那个。
但这只是我的口味..