模拟方法没有返回预期值

时间:2017-01-26 19:23:16

标签: android mockito mvp

我想用Mockito来测试我班级的方法。

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

测试失败是最后发生的事情。这是输出:

  

actual:false,COMPLETE,1

我不理解的是,即使我将stateFlagsAreAllCompleted方法更改为以下代码,然后仍然使用上述输出进行测试失败。

boolean stateFlagsAreAllCompleted(@NonNull final ISplashView view) {

    return true;
}

1 个答案:

答案 0 :(得分:1)

您还没有嘲笑方法stateFlagsAreAllComplete的行为。你需要这样做:

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

您可以将Matchers.any()参数微调到您​​想要的类类型。

编辑:我看到您正在尝试使用方法stateFlagsAreAllComplete进行测试。由于您正在尝试测试SplashPresenter类的方法stateFlagsAreAllComplete,因此您无法通过模拟其方法正在测试的类来实现。您将不得不使用该类的实例。模拟方法只应在测试时在另一个测试方法中调用时使用。

您必须创建要测试的类的实例。