Возможна ли заглушка на Robolectric Activity?

Я тестирую метод в своем коде, который вызывает 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.


person unlimited101    schedule 14.01.2019    source источник


Ответы (1)


 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(), вы также можете использовать активность вместо приложения.

person Kona Suresh    schedule 17.01.2019