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

