当前位置: 首页 > 知识库问答 >
问题:

未找到任何活动。您是否忘记通过调用getActivity()或startActivitySync或类似方法启动活动

索令
2023-03-14

当启动我的android应用程序时,首先启动FirstActivity。当我单击<code>FirstActivity。如果我按下<code>AddTraderActivity

setResult(RESULT_OK);
finish();

结果< code>AddTraderActivity被销毁,并显示< code>FirstActivity。很好。

现在,我想为<code>AddTraderActivityTest<code>编写Espresso的测试

@RunWith(AndroidJUnit4::class)
@SmallTest
class AddTraderActivityTest {

    @get:Rule
    var addTraderActivity: IntentsTestRule<AddTraderActivity> =
        IntentsTestRule(AddTraderActivity::class.java)

    @Test
    fun toolBarHeight() {
        onView(withId(R.id.toolBar))
            .check(matches(withHeightResId(R.dimen.tool_bar_height)))
    }

    @Test
    fun buttonStartTextUppercase() {
        onView(withId(R.id.startButton))
            .check(matches(withTextUppercaseResId(R.string.start)))
    }
}

结果,当我开始这个测试时,然后只开始添加交易者活动,测试成功通过。

现在我想为点击按钮“开始请求”编写测试

这里测试:

@Test
fun pressButtonStartProgressBarDisplayed() {
    onView(withId(R.id.baseTextInputEditText)).perform(typeText("BASE_TEST"))
    onView(withId(R.id.quoteTextInputEditText)).perform(typeText("QUOTE_TEST"))
    onView(withId(R.id.startButton)).perform(click())

    onView(withId(R.id.containerProgressBarLayout)).check(matches(isDisplayed()))
}

结果,当测试运行并按“开始html" target="_blank">请求”按钮时,我得到下一个错误:

测试于16:05开始...

$ adb shell am instrument -w -r   -e debug false -e class 'com.myproject.AddTraderActivityTest#pressButtonStartProgressBarDisplayed' com.myproject.debug.test/androidx.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests

java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
at androidx.test.espresso.base.RootViewPicker.waitForAtLeastOneActivityToBeResumed(RootViewPicker.java:169)
at androidx.test.espresso.base.RootViewPicker.get(RootViewPicker.java:83)
at androidx.test.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:77)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.provideRootView(ViewInteractionModule_ProvideRootViewFactory.java:35)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:24)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:10)
at androidx.test.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:62)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:276)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:268)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我得到这个错误是因为堆栈中没有活动< code>FirstActivity,因为我的测试没有启动它。所以问题是。如何隔离test only < code > AddTraderActivity ?

共有2个答案

乜烨霖
2023-03-14

如果您从< code>ActivityTestRule迁移到< code > ActivityScenario rule (或< code>ActivityScenario),并且尝试测试其< code>onCreate()方法中包含以下代码的活动,则可能会发生此问题:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Workaround the Android bug of multiple Activity task stacks when
  // the app is launched from the Google Play Store. See:
  // https://issuetracker.google.com/issues/36941942
  // https://stackoverflow.com/questions/4341600/multiple-instances-of-activity-from-google-play-launch
  // https://stackoverflow.com/questions/19545889/app-restarts-rather-than-resumes
  if (!isTaskRoot() &&
      getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) &&
      Intent.ACTION_MAIN.equals(getIntent().getAction())) {
    finish();
    return;
  }

  ...
}

此代码适用于ActivityTestRur。但它不适用于ActivityScenarioRurActivityScenario,因为它会在测试尝试启动活动时导致错误:

  • 或者:“java.lang.RuntimeException:未找到任何活动。您是否忘记通过调用 getActivity() 或 startActivitySync 或类似方式来启动活动?
  • 或者:“@Rule活动场景必须实现 MethodRule 或 TestRule”

出现此问题是因为测试将启动活动,然后立即在<code>onCreate()ActivityScenarioRule或ActivityScenario时,必须删除整个if,或者在if子句中添加额外的布尔参数,以检查是否正在运行UI测试。

贝钧
2023-03-14

理想情况下,您可能应该使用单独的类来测试单独的活动。

但是,如果需要,可以使用以下方法隔离每个方法的规则

[编辑](注意:您不能再使用@get:Rule注释):

@Test
public void myTest() {
      // launch desired activity
      var firstActivity: IntentsTestRule<FirstActivity> = IntentsTestRule(FirstActivity::class.java)
      firstActivity.launchActivity(Intent())

      // add tests
      onView(withId(R.id.baseTextInputEditText)).perform(typeText("BASE_TEST"))
      onView(withId(R.id.quoteTextInputEditText)).perform(typeText("QUOTE_TEST"))
}
 类似资料:
  • 问题内容: 我正在尝试在后台解压缩某些文件,因此我像在Google教程中一样使用IntentService。我在AndroidManifest中声明的服务类如下: 在活动中,我有 和服务在这里: 它应该显示吐司只是为了测试,但我总是收到一个错误: 两者(类和活动)都位于同一文件夹(org.osmdroid)中。似乎可以使用路径,但是问题出现了,我没有更多的想法了…… 问题答案: 您正在将服务作为活

  • 我在我们的应用程序中有多个活动。其中一个活动是启动活动,这是主要的启动器活动。它启动并初始化几个类,这些类被整个应用程序使用并完成。 然后是用户大部分时间驻留的主要活动。如果应用程序关闭,则在创建通知时,这些类将被销毁,因此应用程序将给出错误(nullpointerexception)。 我们需要做的是如果应用程序关闭,则启动启动器活动,否则将主要活动放在前面。 我在这里尝试了多种解决方案。 解决

  • 编辑:这是我的舱单

  • 我正在通过Android培训学习Android开发:http://developer.android.com/training/basics/firstapp/index.html 在第一部分的末尾(http://developer.android.com/training/basics/firstapp/starting-activity.html)当我单击按钮时,什么也没有发生,我甚至没有在日

  • 自从在macOS上升级到Android Studio4.0后,我一直有这个问题。当我试图从Android Studio启动我的应用程序时,我会得到以下错误: 我的项目有一点独特之处在于,默认活动是在我的项目使用的另一个库的清单中定义的,而不是项目本身。在升级之前,这一切都很好,但现在不适合我。当我打开包含依赖项的项目时,它可以正常构建和运行。我已经尝试了以下步骤: 清理项目,重建 使缓存无效并重新

  • 问题内容: 这是我的媒体播放器代码。当我在模式下以断点运行时,我不知道这段代码中缺少什么。文件夹中的所有文件都会播放。但是,当我以正常模式运行该应用程序时,会播放第一个文件,然后出现此错误: 码: 问题答案: 您没有调用的方法,即超类。将调用添加到的方法中: