android - Robolectric Activity 是否可以 stub ?

标签 android mockito robolectric stubbing

我正在我的代码中测试一个调用 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/

相关文章:

android - 使用首选项屏幕的主题

java - 测试第 3 方类的工厂

android - Google Goggles - Android 应用程序

android - volley中的JSONRequest和StringRequest有什么区别

java - 如何模拟 object.getMap().get ("String_Key_to_return_Object")

android - Android 单元测试中的模拟改造 Observable<T> 响应

android - 错误 : Gradle 'HelloWorld' project refresh failed: Build script error, 找到不支持的 Gradle DSL 方法 : 'setRoot()' !

android - 如何在 robolectric 3.0 中创建自定义阴影?

android - Robolectric - screen_action_bar.xml 第 #-1 行(抱歉,尚未实现): Error inflating class <unknown>

android - 如何使用 AppCompat 样式隐藏 Listview 的滚动条