MockK无法Stub PackageInfo.versionName报错原因咨询
问题
尝试使用MockK框架Mock android.content.pm.PackageInfo 对象,并Stub其versionName属性,代码如下:
@Test fun test_() { val pInfoMock = mockk<PackageInfo>() every { pInfoMock.versionName } returns "test_version" // <== 此处报错 // ...... }
执行后抛出错误:
Missing mocked calls inside every { ... } block: make sure the object inside the block is a mock io.mockk.MockKException: Missing mocked calls inside every { ... } block: make sure the object inside the block is a mock at io.mockk.impl.recording.states.StubbingState.checkMissingCalls(StubbingState.kt:14) at io.mockk.impl.recording.states.StubbingState.recordingDone(StubbingState.kt:8) at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47) at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:64) at io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:30) at io.mockk.MockKDsl.internalEvery(API.kt:94) at io.mockk.MockKKt.every(MockK.kt:143)
请问错误提示Missing mocked calls inside every { ... } block: make sure the object inside the block is a mock是什么意思?
错误提示的含义
这句话直白翻译过来是:every { ... }代码块内没有捕获到可被Mock的调用,请确认你在块中操作的对象确实是一个MockK创建的Mock实例。
深层原因
PackageInfo的versionName是一个Java字段(field),而非Kotlin属性或Java getter方法。MockK默认只能拦截方法/属性访问器的调用,直接对Java字段进行every { ... } Stub时,MockK无法识别这是一个需要Stub的调用,因此抛出该错误。
解决方法
针对Java字段的Stub,MockK提供了两种常用方案:
方案1:使用mockkStatic配合字段拦截
通过mockkStatic静态Mock目标类,让MockK能够识别字段访问:
@Test fun test_() { val pInfoMock = mockk<PackageInfo>() mockkStatic(PackageInfo::class) every { pInfoMock.versionName } returns "test_version" // 后续测试逻辑 }
方案2:使用宽松Mock并直接赋值
如果只是需要简单设置字段值,使用relaxedMockk创建宽松Mock,直接给字段赋值即可:
@Test fun test_() { val pInfoMock = relaxedMockk<PackageInfo>() pInfoMock.versionName = "test_version" // 后续测试逻辑 }
内容的提问来源于stack exchange,提问作者lannyf
相关产品推荐
相关产品推荐

