我正在我的代码中测试一个调用 Activity.requestPermissions() 的方法。我想使用 Robolectric 阴影功能,所以我使用 Robolectric 创建 Activity
val mockActivity = Robolectric.setupActivity(AppCompatActivity::class.java)
但我希望被隐藏的 Activity 在 requestPermissions() 调用上触发通用答案。
如果可以使用 Robolectric-shadowed Activity
作为 Mockito 的模拟,我可以这样做:
@Test
fun testRequestPermissions()
{
val myCallback = MyCallback()
val mockActivity = Robolectric.setupActivity(AppCompatActivity::class.java)
val shadowActivity = shadowOf(mockActivity)
shadowActivity.grantPermissions(Manifest.permission.RECORD_AUDIO)
`when`(
mockActivity.requestPermissions(
eq(arrayOf(Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_FINE_LOCATION)), anyInt())).then {
myCallback.notify(
arrayOf(Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_FINE_LOCATION), intArrayOf(
PERMISSION_GRANTED, PERMISSION_GRANTED))
...
}
}
class MyCallback
{
fun notify(arrayOf: Array<String>, intArrayOf: IntArray){...}
}
但是不可能在 Robolectric Activity
上使用 Mockito stub 方法。 Robolectric 是否提供诸如方法 stub 之类的东西?
不幸的是我不能在这里使用任何自定义阴影。我试过这样做:
@Implements(AppCompatActivity::class)
class ShadowAppCompatActivity() : ShadowActivity()
{
@Implementation
override fun requestPermissions(permissions: Array<out String>, requestCode: Int)
{
super.requestPermissions(permissions, requestCode)
myCallback.notify(permissions, requestCode)
}
}
但 requestPermissions() 在 ShadowActivity
中是最终的。
最佳答案
ShadowActivity shadowActivity = Shadows.shadowOf(violationsActivity);
ShadowApplication application = Shadows.shadowOf(fragment.getActivity().getApplication());
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
application.grantPermissions(permissions);
ShadowActivity.PermissionsRequest permissionRequest= shadowActivity.getLastRequestedPermission();
assertEquals(1,permissionRequest.requestCode);
此代码将帮助我测试 Activitiy.requestPermission(),您也可以使用 Activity 代替应用程序
关于android - Robolectric Activity 是否可以 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54183946/