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

Mockito Spy对象与原对象关联异常问题排查

Mockito Spy对象与原对象混淆导致的行为异常

问题场景

使用Mockito创建Spy对象后,调用其print()方法时出现预期外的结果:设置Spy对象的名称为"mock name",但最终输出的却是原对象的"origin name"。

类定义(伪代码)

public class MyClass {
    private String m_name = "origin name";
    private final Dumper m_dumper = new Dumper();

    public void setName(String name) {
        m_name = name;
    }

    public void print() {
        m_dumper.print();
    }

    public void dumpName() {
        System.out.println(m_name);
    }

    private class Dumper {
        public void print() {
            dumpName();
        }
    }
}

测试执行代码

MyClass originObject = new MyClass();     
MyClass spyObject = Mockito.spy(originObject);     
spyObject.setName("mock name");       
spyObject.print();  //预期输出"mock name",实际输出"origin name"

根因分析

核心问题出在内部类的隐式外部引用以及Mockito Spy的创建机制:

  • 创建原对象originObject时,其内部的Dumper实例会持有对originObject的隐式强引用。
  • Mockito生成Spy对象时,会创建一个继承自MyClass的代理实例,并将原对象的成员变量值复制到Spy对象中。这意味着Spy对象的m_dumper成员本质上还是原对象的Dumper实例。
  • 当调用spyObject.print()时,实际执行的是原对象Dumper实例的print()方法,该方法调用的dumpName()会访问原对象的m_name属性,而非Spy对象中已更新的m_name,因此输出了原对象的初始值。

内容的提问来源于stack exchange,提问作者hua liang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:19:56