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

无法Mockk Android ServiceInfo类?报错问题求助

解决Mockk拦截ResolveInfo.serviceInfo时的异常问题

异常原因

出现io.mockk.MockKException: Missing mocked calls inside every { ... } block异常的核心原因是:ResolveInfo属于Android框架类,其serviceInfo属性通常是不可重写的final字段,直接使用普通mockk<ResolveInfo>()无法让Mockk正确拦截该属性的访问调用。

解决方案

1. 使用宽松模式Mock ResolveInfo

宽松模式(relaxed)的Mock会自动为所有属性和方法返回默认值,同时允许手动指定特定属性的返回值:

val resolveInfo = mockk<ResolveInfo>(relaxed = true)
val mockServiceInfo = spyk(ServiceInfo())
every { resolveInfo.serviceInfo } returns mockServiceInfo

2. 确保依赖配置正确

根据测试类型(本地单元测试/Instrumented测试)添加对应的Mockk依赖:

  • 本地单元测试(配合Robolectric):
testImplementation "io.mockk:mockk:1.13.8"
testImplementation "org.robolectric:robolectric:4.12.1"
  • Instrumented测试:
androidTestImplementation "io.mockk:mockk-android:1.13.8"

3. 启用Mockk Agent以Mock Final类

如果在本地单元测试中不使用Robolectric,需要启用Mockk Agent来支持Mock final类:

testImplementation "io.mockk:mockk-agent-jvm:1.13.8"

然后在测试类上添加注解:

@MockKAgent
class YourTestClass {
    // 测试代码
}

内容的提问来源于stack exchange,提问作者Aada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:22:35