2017-01-26 5 views
0

Я хочу протестировать метод моего класса с помощью Mockito.Метод mocked не возвращает ожидаемое значение

public class SplashPresenter { 
    public volatile State mField1 = State.DEFAULT; 
    public volatile State mField2 = State.DEFAULT; 

    boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) { 
     if (mField1 == State.COMPLETE // 
       && mField2 == State.COMPLETE) { 

      // Check Forced Update 
      final int updateCheckResult = checkForcedUpdate(); // <=== 
      if (updateCheckResult == MyConstants.PRODUCTION_UPDATE_AVAILABLE) { 
       view.displayForcedUpdateAlert(false); 
       return true; 
      } 

      if (updateCheckResult == MyConstants.BETA_UPDATE_AVAILABLE) { 
       view.displayForcedUpdateAlert(true); 
       return true; 
      } 

      view.restartLoader(); 
      // Move to the home screen 
      return true; 
     } 

     return false; 
    } 

    int checkForcedUpdate() { 
    ...... // my codes 
    } 
} 

и Это мой тестовый класс:

public class SplashPresenterTest_ForStateFlags { 

    private Context mContext; 
    private ISplashView mView; 

    @Before 
    public void setUp() throws Exception { 
     mContext = Mockito.mock(Context.class); 
     mView = Mockito.mock(ISplashView.class); 
    } 

    @Test 
    public void stateFlagsAreAllCompleted() throws Exception { 
     SplashPresenter presenter = Mockito.mock(SplashPresenter.class); 
     presenter.mField1 = State.COMPLETE; 
     presenter.mField2 = State.COMPLETE; 

     when(presenter.checkForcedUpdate()).thenReturn(1); 

     boolean actual = presenter.stateFlagsAreAllCompleted(mView); 
     System.out.println("actual: " + actual + ", " + 
       presenter.mField1 + ", " + 
       presenter.checkForcedUpdate()); 
     assertTrue(actual); 
    } 
} 

провал испытаний, что происходит в конце :(Это выход:

фактическая ложь, ПОЛНОЕ, 1

вещь, которую я не понимаю, даже я меняю метод stateFlagsAreAllCompleted на foll после чего все еще тест заканчивается с выводом выше.

boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) { 

    return true; 
} 

Итак, любая рекомендация будет оценена по достоинству. Благодарю.

ответ

1

Вы еще не издевались над поведением метода stateFlagsAreAllComplete. Вам нужно сделать:

when(presenter.stateFlagsAreAllComplete(Matchers.any()).thenReturn(true); 

Вы можете точно настроить Matchers.any() аргумент типа класса вы хотите.

EDIT: Я вижу, что вы пытаетесь протестировать метод stateFlagsAreAllComplete. Поскольку вы пытаетесь протестировать метод stateFlagsAreAllComplete класса SplashPresenter, вы не можете сделать это, высмеивая класс, метод которого находится под тестированием. Вам придется работать с экземпляром класса. Выделенные методы должны использоваться только во время тестирования, когда они вызываются в другом тестируемом методе.

Вам нужно будет создать экземпляр класса, который вы хотите проверить.

+0

На самом деле я хочу протестировать вывод 'stateFlagsAreAllComplete()' на основе различных условий (разработанных внутри метода). Итак, таким образом, я не могу оценить результат. – Hesam

+0

Теперь я вижу проблему - вы издеваетесь над классом, чей метод вы тестируете. Вы не должны издеваться над тестируемым классом (поражает цель тестирования). Вы должны только издеваться над зависимостями. Создайте экземпляр класса, а затем проверьте его. Я обновляю свой ответ – ucsunil

+0

ах, я этого не знал. Спасибо за Ваш ответ. – Hesam