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); 
    } 
} 

テストの失敗は、最後に何が起こるかです:(これが出力されます。

実際

:、偽COMPLETE、1

私が理解できないことは、stateFlagsAreAllCompletedメソッドをfollに変更することですその結果、上記の出力でテストが失敗します。

boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) { 

    return true; 
} 

だから、お勧めできます。ありがとう。

答えて

1

まだ方法stateFlagsAreAllCompleteの動作を嘲笑していません。

Matchers.any()引数を目的のクラスタイプに微調整することができます。

編集:私はあなたがテストstateFlagsAreAllCompleteを試していることがわかります。あなたがクラスSplashPresenterのメソッドstateFlagsAreAllCompleteをテストしようとしているので、メソッドがテスト中のクラスを嘲笑することはできません。クラスのインスタンスで作業する必要があります。モックされたメソッドは、テスト中に別のメソッドで呼び出されたときのみテストする必要があります。

テストするクラスのインスタンスを作成する必要があります。

+0

実際には、 'stateFlagsAreAllComplete()'の出力を(条件内で設計された)さまざまな条件に基づいてテストしたいと思います。だから、こうして私は出力を評価することができません。 – Hesam

+0

私は今問題を見る - テストしているメソッドのクラスを嘲笑している。あなたはテスト中のクラスを模倣すべきではありません(テストの目的を破る)。あなたは依存性だけを模倣すべきです。クラスのインスタンスを作成し、テストします。私は私の答えを更新する – ucsunil

+0

ああ、私はそれを知らなかった。ご回答有難うございます。 – Hesam

関連する問題