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

使用Mockito Spy监视类方法时存根方法未调用问题排查

问题原因及解决办法

核心问题

你测试代码里创建的spyGetOptionBidPrice和源代码里通过new GetOptionBidPrice(...)生成的实例完全是两个独立对象,给spy设置的存根返回值根本不会作用到源代码实际使用的那个实例上,自然会拿到真实类的默认值0。

解决步骤

要让存根生效,必须让源代码使用你创建的spy实例,而不是自己new新对象,常见实现方式有两种:

  1. 依赖注入替换实例
    如果GetOptionBidPrice是通过构造器注入、Setter注入等方式传入到使用它的类中,测试时直接把你创建的spy注入进去即可:

    // 假设使用该类的业务类为OptionService
    OptionService optionService = new OptionService(spyGetOptionBidPrice);
    // 调用optionService的业务方法,此时会使用你配置好的spy实例
    
  2. 用PowerMock拦截new对象操作(无法修改源代码依赖方式时)
    要是源代码里硬编码了new GetOptionBidPrice(...),没法通过注入替换,就用PowerMock拦截new操作,让它返回你的spy实例:

    // 先配置好spy的存根
    GetOptionBidPrice spyGetOptionBidPrice = spy(new GetOptionBidPrice(...));
    doReturn(100.0).when(spyGetOptionBidPrice).getBidPrice();
    
    // 拦截new操作,返回已配置的spy
    whenNew(GetOptionBidPrice.class).withAnyArguments().thenReturn(spyGetOptionBidPrice);
    

额外提醒

  • Spy的常规用法是包装已有实例,即spy(new GetOptionBidPrice(...)),直接spy类(spy(GetOptionBidPrice.class))会创建空代理实例,容易引发异常或不符合预期的行为。
  • 日常开发尽量避免硬编码new对象,采用依赖注入模式,能大幅降低测试难度。

内容的提问来源于stack exchange,提问作者Kannan J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:55:18