为什么 Activity 在使用 espresso 的 Android Instrumentation 测试(Activity Test)中未启动?

问题描述 投票:0回答:3

我的测试课:

@RunWith(AndroidJUnit4.class)
    public class MainActivityTest {
    
        @Rule
        public ActivityScenarioRule<MainActivity> rule = new  ActivityScenarioRule<>(MainActivity.class);
        ActivityScenario<MainActivity> scenario;
    
        Context context = ApplicationProvider.getApplicationContext();
    
        @Before
        public void launchActivity() {
            scenario = ActivityScenario.launch(MainActivity.class);
            scenario.moveToState(Lifecycle.State.CREATED);
        }
    
        @Test
        public void sendLocationButton_clicked_activateLongClickToastAppear() {
            onView(withId(R.id.location_button)).perform(click());
            onView(withText("Long press it")).inRoot(withDecorView(not(is(getActivity(context).getWindow().getDecorView())))).check(matches(isDisplayed()));
        }
        
    
        @After
        public void tearDown() throws Exception {
            scenario.close();
        }
    }

错误:

java.lang.AssertionError: Activity never becomes requested state "[DESTROYED, RESUMED, CREATED, STARTED]" (last lifecycle transition = "PRE_ON_CREATE")
    at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:338)
    at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:272)
    at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:195)
    at androidx.test.ext.junit.rules.ActivityScenarioRule.lambda$new$0$ActivityScenarioRule(ActivityScenarioRule.java:70)
    at androidx.test.ext.junit.rules.ActivityScenarioRule$$Lambda$0.get(Unknown Source:2)
    at androidx.test.ext.junit.rules.ActivityScenarioRule.before(ActivityScenarioRule.java:103)
    at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)

这只是错误的一部分,因为堆栈溢出会拒绝如此庞大的代码。

我只是想测试单击按钮时是否出现Toast。不知道发生了什么。请帮忙。预先感谢。

android android-espresso android-instrumentation
3个回答
3
投票

这可能是我最近遇到的同样的问题。

尝试添加

debugImplementation "androidx.test:core:1.3.0"

到应用程序级别的 gradle.build 文件,以及您正在使用的核心版本。

此外,您不需要一起使用 ActivityScenarioRule 和 ActivityScenario。选择适合您需求的一款。

ActivityScenarioRule与ActivityTestRule类似。它只会在测试之前启动 Activity(它内部调用 ActivityScenario 来启动 Activity)。

ActivityScenario 为您提供更多控制,因为它允许您在测试期间启动活动,甚至可以在测试期间切换活动。


0
投票

使用 ActivityScenarioRule,您不需要像以前一样强制启动,因为规则已经为您强制启动了。测试运行后还要关闭。只需删除之前和之后的规则,测试就应该可以正常工作。如果您需要这个库,请从活动中获取一些信息。您可以使用 ApplicationProvider.getApplicationContext 创建一个 Context 实例,然后您可以像之前在 onActivity 上一样使用它。


0
投票

发生这种情况可能是因为 Android 正在尝试初始化此 Activity 两次。您可以使用

ActivityTestRule
启动活动并自行管理,也可以使用
ActivityScenario.launch
自行执行。我建议在您的情况下使用
ActivityTestRule

文档:https://developer.android.com/reference/androidx/test/ext/junit/rules/ActivityScenarioRule

© www.soinside.com 2019 - 2024. All rights reserved.