You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何Mock系统类实现类型转换?测试获取内存遇ClassCastException问题

解决Mockito中ActivityManager类型转换异常的问题

你的问题核心在于mock了错误的类型:你创建的是Service的mock对象,但ActivityManager和Service没有继承关系(它是系统服务的实现类,但mock的Service实例与ActivityManager属于完全不同的类型),所以强制类型转换必然抛出ClassCastException。

下面是实现你测试目标的正确方案:

正确的测试代码步骤

  1. 直接Mock ActivityManager对象,而非通用的Service
  2. 配置Context的getSystemService方法,当传入Context.ACTIVITY_SERVICE时返回这个mock的ActivityManager
  3. 最后mock ActivityManager的memoryClass属性返回预期值

完整代码示例:

// 1. 直接Mock ActivityManager实例
val context: Context = mock()
val activityManager: ActivityManager = mock()

// 2. 让Context的getSystemService返回mock的ActivityManager
whenever(context.getSystemService(Context.ACTIVITY_SERVICE))
    .thenReturn(activityManager)

// 3. 配置memoryClass的返回值
whenever(activityManager.memoryClass)
    .thenReturn(500)

// 测试业务代码,此时memClass会返回预期的500
val memClass = (context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass
assertEquals(500, memClass)

为什么之前的方案失败?

你之前mock的是Service类,虽然ActivityManager属于系统服务范畴,但Mockito生成的mock对象只会严格继承你指定的类——Service的mock实例和ActivityManager没有任何类型关联,因此强制转换必然失败。

额外提示

如果你的项目使用AndroidX Test库做Instrumented测试,也可以通过ApplicationProvider获取真实上下文,但纯单元测试场景下,Mock方式依然是更轻量、可控的选择。

内容的提问来源于stack exchange,提问作者Falling Into Infinity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:27:57