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;
}
だから、お勧めできます。ありがとう。
実際には、 'stateFlagsAreAllComplete()'の出力を(条件内で設計された)さまざまな条件に基づいてテストしたいと思います。だから、こうして私は出力を評価することができません。 – Hesam
私は今問題を見る - テストしているメソッドのクラスを嘲笑している。あなたはテスト中のクラスを模倣すべきではありません(テストの目的を破る)。あなたは依存性だけを模倣すべきです。クラスのインスタンスを作成し、テストします。私は私の答えを更新する – ucsunil
ああ、私はそれを知らなかった。ご回答有難うございます。 – Hesam