android 是否有办法在咖啡测试期间暂停和恢复活动?

0sgqnhkj  于 2023-03-11  发布在  Android
关注(0)|答案(2)|浏览(134)

我想做的很简单,我只是想测试我的活动背后的非法状态(在片段提交期间)逻辑。我想暂停活动,尝试提交一个片段,然后Assert我处理的正确。
但是在Espresso测试期间实际暂停然后恢复活动似乎是不可能的。有没有办法在不启动另一个活动的情况下做到这一点?

z18hc3ub

z18hc3ub1#

Quintin在his answer中正确地指出了ActivityScenario.moveToState(newState:)方法,但是他缺少一些细节,我希望在这里补充。
首先,请注意ActivityScenario.launch(activityClass:)方法不仅会启动Activity,还会等待其生命周期状态转换完成。因此,除非您在Activity的生命周期事件方法中调用Activity.finish(),否则您可以假设Activity在ActivityScenario.launch(activityClass:)方法返回时处于RESUMED状态。
其次,一旦Activity启动并处于RESUMED状态,将其移回STARTED状态实际上会导致调用Activity的onPause()方法;同样,将Activity移回CREATED状态也会导致调用其onPause()和onStop()方法。
第三,一旦您将活动移回CREATED或STARTED状态,您必须将其移回RESUMED状态,然后才能在其上执行视图Assert和视图操作,否则您的测试方法将抛出NoActivityResumedException
所有上述内容总结在以下试验方法中:

@Test
fun moving_activity_back_to_started_state_and_then_forward_to_resumed_state() {
    val activityScenario = ActivityScenario.launch(MyActivity::class.java)

    // the activity's onCreate, onStart and onResume methods have been called at this point

    activityScenario.moveToState(Lifecycle.State.STARTED)

    // the activity's onPause method has been called at this point

    activityScenario.moveToState(Lifecycle.State.RESUMED)

    // the activity's onResume method has been called at this point
}

要查看实际操作,请参考this示例应用程序,特别是this测试类。

xt0899hw

xt0899hw2#

您可以尝试ActivityScenario,但它们不包括Pause作为状态。您可能会使用recreate()方法,但那是暂停和恢复。

//possibly:
    // @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    val scenario = ActivityScenario.launch(MyActivity::class.java)
    scenario.moveToState(Lifecycle.State.RESUMED)
    //...
    scenario.recreate()
    //...

我建议使用一些接口/抽象处理程序,以便您可以在Android上下文之外进行单元测试。

相关问题