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

