乐器测试MVP视图

FVo*_*Vod 5 mvp android mocking android-testing android-espresso

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

public interface SplashView extends BaseMVPView {

    void initPresenter();

    void navigateToHome();

    void onError(ApiError apiError);
}
Run Code Online (Sandbox Code Playgroud)

这是由一个活动实现的.

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在创建活动时,它初始化了演示者并调用了一个从API获取一些数据的方法.API调用完成后,演示者将调用navigateToHome或onError方法.所以我想针对这两种情况测试这个过程.我想这必须是一个工具测试,但我不知道如何处理这种情况,以及如何调用这些方法.

非常感谢

Moh*_*ini 2

首先,我建议将MVP架构与Dagger风格混合起来进行依赖注入,这确实有助于测试和Mocking。您可以使用我在 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    @Override
    public void sync() {
        splashActivity.doSomethingYouWant();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助:)