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

