android 未找到活动,是否忘记通过调用getActivity()或startActivitySync或类似方法启动活动

46scxncf  于 2022-11-20  发布在  Android
关注(0)|答案(2)|浏览(122)

当启动我的Android应用程序时,首先启动FirstActivity。当我点击FirstActivity上的按钮,然后启动AddTraderActivity。如果我按下AddTraderActivity中的按钮“START REQUEST”,然后我调用:

setResult(RESULT_OK);
finish();

结果AddTraderActivity被破坏,显示FirstActivity。不错。
现在我想为AddTraderActivityTest编写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)))
    }
}

作为结果,当我开始这个测试,然后开始只AddTraderActivity和测试成功通过。不错。
现在,我想编写点击按钮“START REQUEST”的测试
此处测试:

@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()))
}

结果,当测试运行并按下按钮“START REQUEST”时,我得到下一个错误:
测试开始于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)

我得到这个错误是因为在堆栈中没有活动FirstActivity,因为我的测试没有启动它。所以问题是。我如何ISOLATE只测试AddTraderActivity

m4pnthwp

m4pnthwp1#

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

但是,如果需要,您可以使用以下方法隔离每个方法规则
[编辑](警告:不能再使用@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"))
}
8e2ybdfx

8e2ybdfx2#

如果从ActivityTestRule迁移到ActivityScenarioRule(或ActivityScenario),并且尝试测试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;
  }

  ...
}

此代码与ActivityTestRule配合使用时运行良好。但与ActivityScenarioRuleActivityScenario配合使用时不起作用,因为在测试尝试启动“活动”时它会导致错误:

出现此问题是因为测试将启动“活动,”然后立即在onCreate()中关闭它.因此,在使用ActivityScenarioRuleActivityScenario时,必须删除整个if块,或者在if子句中为check if you are running a UI test添加一个附加得布尔参数.

相关问题