android - 仪器测试对 MVP 的看法

标签 android mocking mvp android-espresso android-testing

我正在开发一个具有 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 方法。所以我想为这两种情况测试这个过程。我想这一定是一个仪器测试,但我不知道如何处理这种情况,以及如何调用这些方法。

非常感谢

最佳答案

首先,我建议将您的 MVP 架构与一些 Dagger 依赖注入(inject)的味道混合起来,这确实有助于测试和模拟。您可以使用我在 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();
    }
}

希望对你有帮助:)

关于android - 仪器测试对 MVP 的看法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39971863/

相关文章:

android - 数据库更新时应用崩溃

java - 类中的 Mockito 和 final equals() 方法 - 它是可模拟的吗?

winforms - 多个MVP演讲者: How to communicate and share information?

Java提示

gwt - 有没有人在他们的项目中使用过 JBoss Errai?

android - 类 PageFragment 中的错误

android - 如何覆盖使用功能和使用权限

c# - Java 中哪个最好;模拟接口(interface)还是模拟类?

android - Android 10 上的共享 Intent (queryIntentActivities) 不会返回所有预期的 Intent

mocking - 检查模拟类中的嵌套数组结构