如何在Android Espresso测试中测试setResult()?

时间:2015-05-06 17:19:11

标签: android android-testing android-espresso

有没有什么好方法可以在Android Espresso测试中测试结果代码和数据?我正在使用Espresso 2.0。

假设我有一个名为Activity的{​​{1}},在执行某项操作后,会使用相应的有效负载调用BarActivity.class

我想编写一个测试用例来验证setResult(int resultCode, Intent data)resultCode。但是,因为datasetResult()方法,所以我无法覆盖它。

我想到的一些选项是:

  • 定义一个像final这样的新方法,然后使用它来拦截它等等......
  • 编写仅限测试的TestActivity,在setActivityResult()上调用startActivityForResult()并在BarActivity
  • 中查看结果

试着想一想这两种罪恶中的哪一种更少,或者是否有关于如何测试这一点的任何其他建议。有什么建议?谢谢!

3 个答案:

答案 0 :(得分:16)

如果同时你切换到最新版的Espresso 3.0.1版,你只需使用ActivityTestRule并获得活动结果:

assertThat(rule.getActivityResult(), hasResultCode(Activity.RESULT_OK));
assertThat(rule.getActivityResult(), hasResultData(IntentMatchers.hasExtraWithKey(PickActivity.EXTRA_PICKED_NUMBER)));

您可以找到一个有效的例子here

答案 1 :(得分:5)

如果您愿意升级到2.1,请查看Espresso-Intents

  

使用有意的API(Mockito.when的表兄弟),您可以为使用startActivityForResult启动的活动提供响应

这基本上意味着可以在启动特定活动时构建并返回任何结果(在您的情况下为 BarActivity 类)。

在此处查看此示例:https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html#intent-stubbing

还有my answer关于一个类似的问题(但是使用了联系人选择器活动),其中我展示了如何构建结果并将其发送回名为 startActivityForResult()的Activity

答案 2 :(得分:0)

这对我有用:


@Test
    fun testActivityForResult(){

        // Build the result to return when the activity is launched.
        val resultData = Intent()
        resultData.putExtra(KEY_VALUE_TO_RETURN, true)

        // Set up result stubbing when an intent sent to <ActivityB> is seen.
        intending(hasComponent("com.xxx.xxxty.ActivityB")) //Path of <ActivityB>
            .respondWith(
                Instrumentation.ActivityResult(
                    RESULT_OK,
                    resultData
                )
            )

        // User action that results in "ActivityB" activity being launched.
        onView(withId(R.id.view_id))
            .perform(click())

      // Assert that the data we set up above is shown.
     onView(withId(R.id.another_view_id)).check(matches(matches(isDisplayed())))
    }

假设在 onActivityResult(requestCode:Int,resultCode:Int,data:Intent?)上进行如下验证:


if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {

    data?.getBooleanExtra(KEY_VALUE_TO_RETURN, false)?.let {showView ->
                if (showView) {
                 another_view_id.visibility = View.VISIBLE
                }else{
                 another_view_id.visibility = View.GONE
                 }
            }
        }

我遵循本指南作为参考:anecdotally,而且我还必须在以上链接https://developer.android.com/training/testing/espresso/intents的末尾检查此链接 和 https://github.com/android/testing-samples/tree/master/ui/espresso/IntentsBasicSample