如何模拟系统 class 进行类型转换

How to mock a system class for type casting

我有以下代码获取当前系统内存:

val memClass = (context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass

我最初的目标是在测试中 return 一个 Int 值。像这样:

whenever((context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass)
.thenReturn(500)

由于它是一个 jUnit 测试并涉及使用 Context,我最终模拟了所有内容:

val context: Context = mock()

val activityService: Service = mock()

whenever(context.getSystemService(Context.ACTIVITY_SERVICE))
            .thenReturn(activityService)

whenever((context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass)
            .thenReturn(500)

现在的问题是 Mockito 无法为 ActivityManager 创建类型转换并抛出此错误:

java.lang.ClassCastException: android.app.Service$MockitoMock4525704 cannot be cast to android.app.ActivityManager

我也试过模拟 ActivityManager 但它不能用作类型转换:

我没有坚持使用当前解决方案的具体要求。我会感谢更好的方法来实现我的初始目标。

我们可能有误会。我说的是这个:

val context: Context = mock()

val activityService: ActivityManager = mock()

whenever(context.getSystemService(Context.ACTIVITY_SERVICE))
            .thenReturn(activityService)

whenever((context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass)
            .thenReturn(500)

据我了解: context.getSystemService( ... ) returns 一个对象。

类android.app.ActivityManager和android.app.Service没有关系。


编辑:

最后一行可能需要替换为
的等价物(给定的代码可能不是正确的 kotlin 语法)

    when(activityService.memoryClass).thenReturn(500);