无法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
相关产品推荐
相关产品推荐

