我有一个BaseActivity,它是一个抽象活动,并未在AndroidManifest中注册。 BaseActivity将在活动的生命周期中调用getPresenter。
public abstract class BaseActivity extends AppCompatActivity{
public abstract Presenter getPresenter;
public abstract int getLayout();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayout());
getPresenter().attachView(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
getPresenter().detachView();
}
}
我使用ActivityTestRule启动BaseActivity,但显示以下错误。
java.lang.RuntimeException: Could not launch activity
如何测试getPresenter().attachView(this)
和getPresenter().detachView()
是否在正确的活动生命周期中调用?
答案 0 :(得分:0)
我对Android测试没有太大的经验,特别是单元测试,但我已经找到了这篇文章,这可能对你有用: Is it possible to test an Abstract activity with Robolectric
另外在Robolectric的Github页面上,我发现了这个:https://github.com/robolectric/robolectric/issues/1441
所以我可以根据你的问题说,是的你可以测试你的抽象类,至少使用Robolectric。
另请阅读:https://gualtierotesta.wordpress.com/2015/01/28/tutorial-java-abstract-classes-testing/
编辑:现在,Robolectric不直接支持API 23,但您可以在测试类的配置中“降级”它,如下所示:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest {
MainActivity_ activity = Robolectric.setupActivity(MainActivity.class);
}
答案 1 :(得分:0)
显示错误是因为未在Android Manifest中注册BaseActivity。似乎有一些解决方案可以在测试包中添加活动。
但是,我最终选择了另一种解决方案,将活动的生命周期委托给其他人。 这个想法在Mosby剧本中提到。
http://hannesdorfmann.com/android/mosby-playbook/
新的BaseActivity:
public abstract class BaseActivity extends AppCompatActivity implements BaseMvpView, DelegateCallback{
private ActivityMvpDelegate activityDelegate;
protected ActivityMvpDelegate getActivityDelegate() {
if (activityDelegate == null) {
activityDelegate = createActivityDelegate();
}
return activityDelegate;
}
protected ActivityMvpDelegate createActivityDelegate() {
return new ActivityMvpDelegateImpl(this, this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivityDelegate().onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
getActivityDelegate().onDestroy();
}
}
最后,我可以在没有活动生命周期的情况下测试委托类。