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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:20:47