仪器测试对 MVP 的看法

Instrumental Testing a view on MVP

我正在开发具有 MVP 架构的 Android 应用程序,我已经能够测试 Presenter 和 Model 类,但现在我正在尝试测试 View 方法。 例如,我有以下观点:

public interface SplashView extends BaseMVPView {

    void initPresenter();

    void navigateToHome();

    void onError(ApiError apiError);
}

由Activity实现。

public class SplashActivity extends BaseActivity implements SplashView {

    // MVP Presenter
    private SplashPresenter splashPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initPresenter();
    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_splash;
    }

    @Override
    public void destroy() {
        if(splashPresenter != null) {
            splashPresenter.onDestroy();
            splashPresenter = null;
        }
    }

    @Override
    public void initPresenter() {
        if(splashPresenter == null) {
            splashPresenter = new SplashPresenterImpl(this, ApiClient.getService());
            sync();
        }
    }

    @Override
    public void navigateToHome() {
        NavigationUtils.navigateToActivity(this, MainActivity.class, true);
    }

    @Override
    public void onError(ApiError apiError) {
        DialogUtils.showOKCancelDialog(...);
    }

    private void sync() {
        if(splashPresenter != null) {
            splashPresenter.sync();
        }
    }
}

如您所见,当创建 activity 时,它会初始化呈现器并调用一个方法,该方法将从 API 获取一些数据。 API 调用完成后,演示者将调用 navigateToHome 或 onError 方法。所以我想为这两种情况测试这个过程。我想这一定是一个仪器测试,但我不知道如何处理这种情况,以及如何调用这些方法。

非常感谢

您可以为此使用 mockito 框架。 Mockito.verify 做你想做的 - 它检查是否调用了特定方法。

https://code.tutsplus.com/tutorials/testing-and-dependency-injection-with-model-view-presenter-on-android--cms-26164 文章到此,希望对你有所帮助

首先,我建议将您的 MVP 架构与一些 Dagger 依赖注入的味道混合起来,这确实有助于测试和 嘲讽。您可以使用我在 Github 上发布的示例了解更多信息,其中还包含不同类型的测试:

http://github.com/mmirhoseini/fyber_mobile_offers

顺便说一句,在这种类型的开发中,您必须模拟您的 SplashPresenter 并将其插入而不是真实的,以便您可以使用模拟的演示者更改真实的演示者做你想做的。

为此,您必须扩展 Activity 并覆盖 initPresenter 方法:

class MockSplashActivity extends SplashActivity {
    @Override
    public void initPresenter() {
        if (splashPresenter == null) {
            splashPresenter = new MockSplashPresenterImpl(this, ApiClient.getService());
            sync();
        }
    }
}

并扩展你的演示者并改变你想要在测试中按照你想要的方式行事的方法(我想你想用同步方法做一些事情):

class MockSplashPresenterImpl extends SplashPresenterImpl {
    public MockSplashPresenterImpl(SplashActivity splashActivity, Object service) {
        super(splashActivity, service);
    }

    @Override
    public void sync() {
        splashActivity.doSomethingYouWant();
    }
}

希望对您有所帮助:)