ActivityScenario<MainActivity> 挂起执行(click())

Phl*_*lip 4 android android-activity android-espresso

一般来说,我来这里是因为ActivityTestRule<>不推荐使用久经考验的,显然我需要使用ActivityScenario<>or ActivityScenarioRule<>

但是他们打破了“对视图的测试应该像对待对象一样对待视图对象”的规则。例如,我必须“有效地”将所有断言填充到回调中。我无法开始ActivityScenarioRule<>工作,因为无法填充我的数据库并延迟对onCreate().

所以这给我留下了ActivityScenario<>,我可以做到这一点:

    //  stuff database
    ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class);

    scenario.onActivity( (ma) -> {
        //  assertions on ma that pass

        onView(withId(R.id.configure_device_button)).perform(click());
        
        //  ...
    } );
Run Code Online (Sandbox Code Playgroud)

问题是perform(click())挂断,在wait().

我们还在等什么?

当我将视图对象视为对象时,ma.configureDeviceButton.performClick()有效。所以这意味着我现在必须重新编写数百个视图测试中的每一个......


事实证明,我可以ma像这样共享我的 MainActivity 句柄:

    activateActivity( (ma) -> {
        TestFixtures.ma = ma;
    } );
Run Code Online (Sandbox Code Playgroud)

MainActivity 的寿命比它的回调更长。(如果我们不使用 Execute Around 模式,那么为什么要使用回调呢?)

所以我可能不需要重新设计所有东西。每个人仍然需要一个答案,为什么我的书perform(click())挂了,但是......

小智 5

onActivity 动作块在 UIThread 上执行,onView 将等待 UIThread 空闲。

您需要在 onActivity 块之外调用 onView 否则它会死锁。从你的代码

scenario.onActivity( (ma) -> {
   //  Do your UI setup
});
onView(...).perform(...);
Run Code Online (Sandbox Code Playgroud)