使用 bundle 启动 activity 时如何使用 ActivityTestRule?

How to use ActivityTestRule when launching activity with bundle?

我正在使用

  val activityRule = ActivityTestRule(SingleFragmentActivity::class.java, true, true)

并且 SingleFragmentActivity 是一个测试助手 activity class 我使用了 google GithubBrowseSample

如何使用捆绑包启动 activity?

您可以从 activityRule 中获取 activity 并且可以为 intent

设置额外的数据
activityRule.activity.intent.putExtra("key",value)

有两种方法可以实现您想要的效果。不幸的是,第一个需要创建自定义 ActivityRule,这将覆盖某些方法。

第二种方法不需要覆盖 ActivityRule:

但它需要将 false 作为 ActivityRule 构造函数 (launchActivity = false) 的第三个参数传递。在你的情况下:

val activityRule = ActivityTestRule(SingleFragmentActivity::class.java, true, false)

我建议使用第二种方法,因为这样可以很容易地将意图传递给 ActivityRule,但需要在测试启动时手动启动 activity:

activityRule.launchActivity(
    Intent(context, SingleFragmentActivity::class.java).apply {
        /*put arguments */
    }
)

你有2个选项。 第一:如果您希望在每次测试中都具有相同的意图(例如,具有相同的额外功能)。

    @get:Rule
    var rule: ActivityTestRule<YourActivity> =
        object : ActivityTestRule<YourActivity>(YourActivity::class.java) {
            override fun getActivityIntent(): Intent {
                val targetContext = InstrumentationRegistry.getInstrumentation().targetContext
                return Intent(targetContext, YourActivity::class.java).apply {
                    putExtra("someString","string")
                    putExtra("someBoolean",true)
               }
            }
         }

第二:如果你想在每个测试中有不同的意图(例如,有不同的附加功能):

    @get:Rule
    val rule = ActivityTestRule(YourActivity::class.java,
    true,
    false) // launch activity later -> if its true, the activity will start here

    @Test
    fun testFunction(){
        val intent = Intent()
        intent.putExtra("name",value)
        intent.putExtra("someBoolean",false)
        rule.launchActivity(intent)
    }

来源:http://blog.sqisland.com/2015/04/espresso-21-activitytestrule.html