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

MockK调用私有构造生成无效对象,如何指定其使用CObject.allocate创建实例

解决方法

你可以通过以下配置让MockK使用CObject.allocate()创建实例,避免直接调用私有构造生成指针为0的无效实例:

1. 局部替换构造逻辑

如果只需要单测用例内临时生效,可在mockkConstructor中自定义实例生成逻辑:

mockkConstructor(CObject::class) {
    // 所有构造CObject的调用都改为返回allocate生成的实例
    anyConstructed<CObject>() answers {
        // 可根据需求选择返回真实实例或带mock能力的spy实例
        spyk(CObject.allocate())
    }
}

// 后续业务代码中构造的CObject都会走上述逻辑

2. 全局配置构造逻辑

如果需要全局替换CObject的实例生成规则,可使用静态mock配合构造拦截实现:

// mock伴生对象,确保allocate调用可配置
mockkStatic(CObject.Companion::class)
// 不需要mock allocate的真实逻辑时保留callOriginal,需要自定义返回时替换为对应逻辑即可
every { CObject.allocate() } answers { callOriginal() }
// 拦截所有CObject构造请求,返回allocate生成的实例
every { anyConstructed<CObject>() } returns CObject.allocate()

若测试环境没有加载对应的native库,无法调用真实allocate方法,可以直接反射构造CObject实例,手动注入合法的测试用指针值:

val testPointer = 0x10000L // 测试用自定义指针值
val mockCObject = spyk(CObject::class, recordPrivateCalls = true) {
    setPrivateField("_internalCPointer", testPointer)
}
// 按需配置doACThing方法的mock逻辑
every { mockCObject.doACThing() } returns Unit

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:54:05