有没有什么好方法可以在Android Espresso测试中测试结果代码和数据?我正在使用Espresso 2.0。
假设我有一个名为Activity
的{{1}},在执行某项操作后,会使用相应的有效负载调用BarActivity.class
。
我想编写一个测试用例来验证setResult(int resultCode, Intent data)
和resultCode
。但是,因为data
是setResult()
方法,所以我无法覆盖它。
我想到的一些选项是:
final
这样的新方法,然后使用它来拦截它等等...... setActivityResult()
上调用startActivityForResult()
并在BarActivity
试着想一想这两种罪恶中的哪一种更少,或者是否有关于如何测试这一点的任何其他建议。有什么建议?谢谢!
答案 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 类)。
还有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