Я тестирую метод в своем коде, который вызывает Activity.requestPermissions(). Я хочу использовать функции затенения Robolectric, поэтому я создаю Activity с помощью Robolectric, используя
val mockActivity = Robolectric.setupActivity(AppCompatActivity::class.java)
Но я хотел бы, чтобы теневая активность вызывала общий ответ на вызов requestPermissions().
Если бы можно было использовать Activity
с тенью Robolectric в качестве макета для 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){...}
}
Но невозможно заглушить методы с помощью Mockito на Robolectric Activity
. Предоставляет ли Robolectric что-то вроде заглушки методов?
К сожалению, я не могу использовать здесь какую-либо пользовательскую тень. Я пытался сделать это:
@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
.