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

