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

如何用Mockk的mockkConstructor模拟构造器返回Mock对象而非真实对象

解决Kotlin中Mockk模拟内部创建对象的问题

你要测试的类A内部初始化时直接创建B实例,无法通过依赖注入改造,尝试用Mockk的mockkConstructor时写法有误导致失败,以下是正确的解决方案:

正确用法示例

当你用mockkConstructor模拟B的构造器后,所有通过B()创建的实例都会自动是Mockk的mock对象,无需额外返回mock。如果需要Stub B的方法,直接针对anyConstructed<B>()设置行为即可:

import io.mockk.every
import io.mockk.mockkConstructor
import io.mockk.verify
import org.junit.Test
import kotlin.test.assertEquals

class B {
    fun doSomething(): String = "real output"
}

class A {
    val b: B
    init() {
        b = B()
    }
}

class ATest {
    @Test
    fun `verify internal B is mocked`() {
        // 模拟B的构造器
        mockkConstructor(B::class)

        // 可选:Stub B的方法行为
        every { anyConstructed<B>().doSomething() } returns "mocked output"

        // 创建A实例,内部的b会是mock对象
        val a = A()

        // 验证B的构造器被调用一次
        verify(exactly = 1) { B() }

        // 测试B的方法是否返回mock结果
        assertEquals("mocked output", a.b.doSomething())

        // 测试结束后清理mock(可选,也可用@After方法统一处理)
        unmockkConstructor(B::class)
    }
}

你之前写法的问题

  • 第一种写法错误:anyConstructed<B>()是用来获取已构造的mock实例的工具方法,不能放在every块里作为Stub的目标,所以会报"Missing mocked calls inside every { ... } block"错误。
  • 第二种写法错误:every { A() } returns mockk<B>()逻辑完全错误,你要mock的是B的构造器而非A的构造器,且A的实例类型与B不匹配,导致真实构造方法被调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:05:16