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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:41:02