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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:20:20