2017-02-13 16 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. Мокито говорит, что .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

My 'RetrieveImpl' принимает' Context' как единственный параметр в своем конструкторе, а 'Mockito' дает мне ошибку, говоря, что ему нужен конструктор 0-arg. Могу ли я издеваться над «Контекстом», или мне нужно следовать другому методу? –

+1

Добавьте конструктор по умолчанию и setter для контекста. Затем издевайтесь над контекстом и вводите в RetrieveImpl с помощью установщика –

 Смежные вопросы

  • Нет связанных вопросов^_^