【问题标题】:How can I test setResult() in an Android Espresso test?如何在 Android Espresso 测试中测试 setResult()?
【发布时间】:2015-05-06 17:19:11
【问题描述】:

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

假设我有一个名为BarActivity.classActivity,它在执行某些操作时会使用适当的有效负载调用setResult(int resultCode, Intent data)

我想编写一个测试用例来验证resultCodedata。但是,由于setResult()final 方法,我无法覆盖它。

我想到的一些选项是:

  • 定义一个像setActivityResult()这样的新方法,然后使用它就可以被拦截,等等......
  • 编写一个仅用于测试的TestActivity,它将在BarActivity 上调用startActivityForResult(),并在TestActivity.onActivityResult() 中检查结果

尝试思考两种弊端中哪一个较小,或者是否有任何其他关于如何测试的建议。有什么建议?谢谢!

【问题讨论】:

标签: android android-testing android-espresso


【解决方案1】:

如果您同时切换到最新的 Espresso 版本 3.0.1,您可以简单地使用 ActivityTestRule 并获得这样的活动结果:

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

您可以找到一个工作示例here

【讨论】:

  • 这绝对是最干净的方式,只要能到3.0.1就可以了。
  • 如果无法解析hasResultCodehasResultData。在 build.gradle 中添加androidTestCompile 'com.android.support.test.espresso:espresso-contrib:3.0.1'
  • 你拯救了我的一天。谢谢!
【解决方案2】:

如果你愿意升级到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() 的活动

【讨论】:

  • 我看不到如何使用 Espresso-Intents 测试 setResult 方法。你能澄清一下吗?
【解决方案3】:

这对我有用:


@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
                 }
            }
        }

我按照本指南作为参考:https://developer.android.com/training/testing/espresso/intents,而且我还必须检查上述链接末尾的链接 https://github.com/android/testing-samples/tree/master/ui/espresso/IntentsBasicSamplehttps://github.com/android/testing-samples/tree/master/ui/espresso/IntentsAdvancedSample

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多