Есть ли возможная заглушка на Robolectric Activity? - PullRequest
0 голосов
/ 14 января 2019

Я тестирую метод в своем коде, который вызывает Activity.requestPermissions (). Я хочу использовать функции затенения Robolectric, поэтому я создаю Activity с помощью Robolectric, используя

val mockActivity = Robolectric.setupActivity(AppCompatActivity::class.java)

Но я бы хотел, чтобы теневое действие инициировало общий ответ на вызов 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){...}

}

Но невозможно заглушить методы с помощью Mockito на Robolectric Activity. Robolectric обеспечивает что-то вроде заглушки метода?

К сожалению, я не могу использовать здесь какую-либо Custom Shadow. Я пытался сделать это:

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

1 Ответ

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

...