Mockito中如何使用未被直接调用的Mock对象?
如何在Foo的xMethod中使用Mock的Ent实例
问题分析
你当前的写法无法直接将Mock的Ent注入到Foo的xMethod中,因为ent是通过y.callExternalMethod()生成的局部变量,@InjectMocks仅能注入Foo的成员变量,无法替换方法内的局部变量。正确的做法是Mocky这个依赖,让它返回你预设的Ent实例。
步骤1:调整Foo类,让依赖y可注入
首先需要把y作为Foo的成员变量,并提供注入方式(构造方法或setter均可):
class Foo { // 将y声明为成员变量,支持依赖注入 private Y y; // 通过构造方法注入y public Foo(Y y) { this.y = y; } public String xMethod() { Ent ent = y.callExternalMethod(); if(ent.equals("")){ // ...原有业务逻辑 } // ...其他逻辑 return someResult; } }
步骤2:修改测试类,Mock依赖y并预设返回值
在测试类中Mocky,并指定它调用callExternalMethod()时返回你需要的Ent实例(可以是自定义实例,也可以是Mock的Ent):
import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.mockito.Mockito.when; class FooTest { // Mock Foo依赖的y对象 @Mock private Y y; // 注入Mock的y到Foo实例中 @InjectMocks private Foo f; // 初始化Mockito注解 @Before public void setUp() { MockitoAnnotations.openMocks(this); } @Test public void checkFooWithMock() { // 方式1:使用自定义的Ent实例 Ent targetEnt = new Ent(someData); // 方式2:如果需要Mock Ent的行为,可以直接Mock Ent // @Mock // private Ent targetEnt; // 设定当y调用callExternalMethod时,返回我们预设的Ent when(y.callExternalMethod()).thenReturn(targetEnt); // 如果用了Mock的Ent,还可以预设它的方法行为,比如equals判断 // when(targetEnt.equals("")).thenReturn(true); // 执行测试方法 String result = f.xMethod(); // 这里添加断言验证结果,比如: // assertEquals(expectedResult, result); } }
关键说明
- 核心思路:Mock依赖源而非局部变量,因为局部变量是方法内部生成的,无法直接被Mockito替换,只能通过控制它的生成来源(即
y.callExternalMethod())来获取预设的实例。 - 确保
Y类是一个可被Mock的类型(比如不是final类,方法不是final方法),否则Mockito无法生成Mock实例。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

