AndroidX 测试 - ActivityScenario API 立即销毁活动

use*_*390 5 java testing android android-studio

我一直在尝试将我的 Robolectic 测试用例移至 Android X 测试。我遵循了文档,但无法通过 Activity Scenario Launch API 启动活动。

https://developer.android.com/reference/androidx/test/core/app/ActivityScenario

http://robolectric.org/androidx_test

protected void setupActivity() {
      ActivityScenario<VisitorExemptionActivity> scenario = ActivityScenario.launch(VisitorExemptionActivity.class);
        scenario.moveToState(Lifecycle.State.CREATED);// Activity destroyed before reaching to this point.
}
Run Code Online (Sandbox Code Playgroud)

除了 onStart 之外,上面的代码不会调用任何 android 生命周期,抛出以下异常并立即销毁活动。

java.lang.IllegalStateException:由于 Activity 已被销毁,因此无法移动到状态“CREATED”

当我用 Robolectric 尝试相同的代码时。它工作正常并调用所有生命周期。oncreate 、 onstart 和 onResume。

protected void setupActivity() {
activityController = Robolectric.buildActivity(VisitorExemptionActivity.class).setup();
activityController.get();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码调用了所有的生命周期。

请你能向我解释我做错了什么。

提前致谢。

Top*_*ter 0

我遇到了类似的问题,经过一些调试和测试“测试”后:

  • onActivity在我的 Activity 之后调用onCreate(...)
  • SaidonCreate(...)启动一个后台线程,该线程根据条件调用所说 Activity 的finish().
  • 最后,onActivity如果 Activityfinish()在它之前被调用,则永远不会被调用。

该错误可能会显示“已销毁”,但onActivity的文档称,如果 Activity 处于“完成”或“完成”状态,它甚至会抛出错误。

这是一个惊喜,因为我的测试都是关于检查是否finish()在设置活动的正确属性后被调用。

解决方案

溶液A;我未弃用ActivityTestRule,您可能已经知道,这没什么大不了的,并且是众所周知的 AndroidX 库一直为 Android 的 API(不是它自己的 API)所做的事情。

从以下位置获取ActivityTestRule.java文件:
https://gist.github.com/top-master/2127623cd837df9a9633714c44a56e16

溶液B;在您的活动中添加并使用类似的内容:

protected void finishSafely() {
    if (MyApp.isTestRun()) {
        MyApp.triggerTestHook("MyActivity:finishing");
    } else {
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要决定如何实现isTestRun()triggerTestHook(...)方法(它们的名称解释了它们的作用)。