如何Mock系统类实现类型转换?测试获取内存遇ClassCastException问题
解决Mockito中ActivityManager类型转换异常的问题
你的问题核心在于mock了错误的类型:你创建的是Service的mock对象,但ActivityManager和Service没有继承关系(它是系统服务的实现类,但mock的Service实例与ActivityManager属于完全不同的类型),所以强制类型转换必然抛出ClassCastException。
下面是实现你测试目标的正确方案:
正确的测试代码步骤
- 直接Mock
ActivityManager对象,而非通用的Service - 配置
Context的getSystemService方法,当传入Context.ACTIVITY_SERVICE时返回这个mock的ActivityManager - 最后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
相关产品推荐
相关产品推荐

