为什么使用Espresso在Android Instrumentation测试(Activity测试)中无法启动Activity?

4

我的测试类:

@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消息。对于发生了什么毫无头绪。请帮忙。先感谢您。


我不确定你的“场景(scenario)”是否必要,这可能是问题的原因。在这里查看文档:https://developer.android.com/training/testing/ui-testing/espresso-testing#java - agoff
我也遇到了同样的问题。@ChandrimG,你解决了这个问题吗? - Akbarsha
3个回答

2
可能是我最近遇到的同样问题。尝试添加:
debugImplementation "androidx.test:core:1.3.0"

将您正在使用的核心版本添加到应用程序级别的gradle.build文件中。

此外,您不需要同时使用ActivityScenarioRule和ActivityScenario。选择适合您需求的方法即可。

ActivityScenarioRule类似于ActivityTestRule,它仅会在测试之前启动活动(在内部调用ActivityScenario启动活动)。

ActivityScenario可以使您更加掌控,因为它允许您在测试期间启动一个活动,甚至在测试期间切换活动。


0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接