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

Kotlin Mockito无法验证函数内部调用次数的问题及解决诉求

解决Mockito无法验证方法内部调用的问题

你当前的测试代码中,用mock<Factory>()创建的是全Mock对象,并且手动stub了getFish()的返回值。此时调用mockedFactory.getFish()时,执行的是你定义的stub逻辑,而非Factory类中getFish()的真实代码,原方法里的getTree()调用根本不会触发,因此verify会报错。

方案1:使用Spy验证真实方法的内部调用

如果不需要修改getFish()的返回值,直接创建原对象的Spy代理,它会保留原方法的执行逻辑:

@Test
fun testFish() {
    val factorySpy = spy(Factory())
    factorySpy.getFish()
    verify(factorySpy, times(1)).getTree()
}

方案2:Spy结合Stub修改特定方法行为

如果需要修改某个方法的返回值,同时保留其他方法的真实执行逻辑(比如修改getTree()的返回,但让getFish()执行原逻辑):

@Test
fun testFish() {
    val factorySpy = spy(Factory()) {
        on { getTree() } doReturn "mocked tree"
    }
    val result = factorySpy.getFish()
    assert(result == listOf(1,2,3,4,5)) // 验证getFish()仍返回原逻辑的结果
    verify(factorySpy, times(1)).getTree()
}

方案3:Mock对象结合thenCallRealMethod()

如果必须使用全Mock对象,同时要让getFish()执行真实逻辑(从而触发内部的getTree()调用):

@Test
fun testFish() {
    val factoryMock = mock<Factory> {
        on { getFish() } thenCallRealMethod() // 指定getFish()执行真实方法逻辑
        on { getTree() } doReturn "mocked tree"
    }
    factoryMock.getFish()
    verify(factoryMock, times(1)).getTree()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:41:05