片段测试,我错过了等同于ActivityScenarioRule

问题描述

我习惯于通过在Espresso测试中启动包含它的Activity来测试我的片段。这已经很好地工作了,我已经能够通过添加到ActivityScenarioRule(或IntentsTestRule)中的一些测试规则(例如OkHttpIdlingResourceRule)来控制测试环境/执行,然后将其用于启动Activity。

现在,我正在朝着单一活动方法发展,并且还使用导航组件,我想开始隔离测试我的片段。但是,要做到这一点,我将需要与活动测试中存在的片段测试类似的功能。 ActivityScenarioRule实现TestRule,但FragmentScenario不实现,并且也不是FragmentScenarioRule。

我想念什么吗?

解决方法

实际上非常简单。在测试活动时,我有一个包含以下内容的基本测试类:

@Rule @JvmField
val activityRule: IntentsTestRule<*>

@Rule @JvmField
val chain: RuleChain

init {
    activityRule = IntentsTestRule(
            activityClass,true,// true if the Activity should be placed into "touch mode" when started
            false) // launchActivity

    var initChain = RuleChain.outerRule(firstRule)
            .around(OkHttpIdlingResourceRule())
            .around(activityRule) 

    for (rule in additionalTestRules) {
        initChain = initChain.around(rule)
    }

    chain = initChain
}

在测试中,活动是使用activityRule.launchActivity(null)启动的 现在,当测试Fragments时:

@Rule
@JvmField
val chain: RuleChain

init {
    var initChain = RuleChain.outerRule(firstRule)
            .around(OkHttpIdlingResourceRule())

    for (rule in additionalTestRules) {
        initChain = initChain.around(rule)
    }

    chain = initChain
}

在测试中,片段通过launchFragmentInContainer()启动

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...