Scala中Mockito使用Spy时,如何避免thenReturn触发真实方法执行?
在Scala中使用Mockito Spy时避免执行真实方法的解决方案
当你使用Mockito的spy对象时,when(spy.method()).thenReturn(...)的写法确实会先执行真实的方法逻辑,这就是你遇到随机抛出RuntimeException的原因——因为它会先调用functionToTest,触发那个条件判断。
要在不执行真实方法的情况下存根返回值,你需要改用Mockito的**doReturn语法**,这是专门为spy对象设计的存根方式,不会触发真实方法调用:
修改你的测试代码如下:
testclsToTest() { test("test functionToTest") { val spiedclsToTest = spy(new clsToTest()) // 改用doReturn存根,不会执行真实的functionToTest doReturn("value to replace").when(spiedclsToTest).functionToTest // 现在调用spiedclsToTest.functionToTest()或者依赖它的方法,都会返回你指定的值 // spiedclsToTest.otherFunctionThatUsesFunctionToTest() } }
为什么这个方法有效?
when(spy.method())的执行逻辑是先调用真实方法来获取方法的调用信息,再存根返回值;而doReturn(...).when(spy).method()则是直接告诉Mockito:当这个spy对象的指定方法被调用时,返回给定的值,完全跳过真实方法的执行流程。
如果你的方法带有参数,写法也是类似的,只需要把参数放到方法调用里:
// 假设functionToTest有参数 doReturn("param-value").when(spiedclsToTest).functionToTest("input-param")
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

