乐器测试MVP视图

时间:2016-10-11 06:54:44

标签: 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);
}

由活动实施。

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

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

非常感谢

2 个答案:

答案 0 :(得分:2)

首先,我建议将您的 MVP 架构与依赖注入的 Dagger 品味混合在一起,这真的有助于测试和模拟。您可以使用我在Github上发布的样本了解更多内容,该示例还包含不同类型的测试:

  

http://github.com/mmirhoseini/fyber_mobile_offers

顺便说一句,在这种类型的开发中,你必须模拟你的 SplashPresenter 并插入它而不是真实的那个,让你用一个模拟的演示者来改变真正的演示者,做你想做的事。

为此,您必须扩展您的活动并覆盖 initPresenter 方法:

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

并且还扩展您的演示者并更改您希望在测试中按照您想要的方式执行的方法(我认为您希望使用sync方法执行某些操作):

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

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

我希望它有所帮助:)

答案 1 :(得分:0)

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

$project 这篇文章,我希望它会有所帮助。