如何使用Mockito模拟父类的成员或方法?含静态创建A对象场景
解决方案
首先要指出你提供的代码存在编译错误:静态方法createA()无法直接访问父类的实例变量a,静态成员只能访问静态成员。所以第一步需要修正这个问题,两种常见调整方式:
- 将
a改为静态变量 - 把
createA()改为实例方法,或者调整为返回A实例的静态方法,由实例来接收
下面针对修正后的代码,提供两种模拟A对象的方案:
方案1:重构代码实现依赖注入(推荐)
通过依赖注入让A的创建逻辑与父类解耦,这样测试时可以直接传入Mock的A实例,无需修改原有创建逻辑。
修正后的父类和子类代码:
abstract class Parent { protected A a; // 构造注入A实例 protected Parent(A a) { this.a = a; } public void doSomething() { a.foo(); } // 保留原有的A创建逻辑,但改为返回实例而非直接赋值 static A createA() { return new A(); } } class Child1 extends Parent { // 普通构造器,使用父类的默认创建逻辑 public Child1() { super(Parent.createA()); } // 测试专用构造器,允许传入自定义A实例 public Child1(A customA) { super(customA); } }
测试时使用Mockito创建Mock的A对象:
import org.junit.Test; import org.mockito.Mockito; public class Child1Test { @Test void testDoSomething() { // 创建Mock的A对象 A mockA = Mockito.mock(A.class); // 传入Mock实例创建Child1对象 Child1 child = new Child1(mockA); // 调用目标方法 child.doSomething(); // 验证Mock对象的foo方法被调用 Mockito.verify(mockA).foo(); } }
方案2:使用PowerMock模拟静态方法(无法重构代码时)
如果不能大量修改原有代码,只能通过静态方法创建A,可使用PowerMock拦截静态方法调用,返回Mock的A实例。
首先确保代码修正了静态方法访问实例变量的问题,比如将a改为静态变量:
abstract class Parent { static A a; static void createA() { a = new A(); } public void doSomething() { a.foo(); } } class Child1 extends Parent { static { createA(); } }
测试代码(需引入PowerMock和Mockito依赖):
import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Parent.class) public class Child1Test { @Test void testDoSomething() { A mockA = Mockito.mock(A.class); // 模拟Parent类的静态方法createA(),将静态变量a赋值为Mock对象 PowerMockito.mockStatic(Parent.class); PowerMockito.doAnswer(invocation -> { Parent.a = mockA; return null; }).when(Parent.class); Parent.createA(); // 创建Child1实例,触发静态代码块调用createA() Child1 child = new Child1(); child.doSomething(); Mockito.verify(mockA).foo(); } }
内容的提问来源于stack exchange,提问作者Saravananand Krishnamani
相关产品推荐
相关产品推荐

