如何测试android抽象活动?

时间:2015-12-23 06:44:06

标签: android testing android-testing

我有一个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()是否在正确的活动生命周期中调用?

2 个答案:

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

}

最后,我可以在没有活动生命周期的情况下测试委托类。