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方法.所以我想针对这两种情况测试这个过程.我想这必须是一个工具测试,但我不知道如何处理这种情况,以及如何调用这些方法.
非常感谢
首先,我建议将MVP架构与Dagger风格混合起来进行依赖注入,这确实有助于测试和Mocking。您可以使用我在 Github 上发布的示例了解更多信息,该示例还包含不同类型的测试:
顺便说一句,在这种类型的开发中,您必须模拟您的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)
我希望它有帮助:)
| 归档时间: |
|
| 查看次数: |
470 次 |
| 最近记录: |