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

如何Mock非静态工厂类中的静态方法?附ABCFactory代码示例

Mock非静态工厂类中的静态方法(以ABCFactory为例)

我经常碰到这种单例工厂的Mock场景,标准Mockito搞不定静态方法,得靠PowerMock搭配Mockito来解决,下面给你一步步拆解怎么做:

1. 先加依赖(Maven示例)

得确保项目里引入匹配版本的PowerMock和Mockito依赖,比如PowerMock 2.0+对应Mockito 3.x+:

<dependencies>
    <!-- Mockito核心依赖 -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>3.12.4</version>
        <scope>test</scope>
    </dependency>
    <!-- PowerMock适配JUnit4和Mockito的依赖 -->
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2. 编写测试类

测试类需要加PowerMock专属注解,然后按步骤Mock静态方法和实例方法:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class) // 指定用PowerMock的Runner运行测试
@PrepareForTest(ABCFactory.class) // 告诉PowerMock要修改这个类的字节码来支持静态Mock
public class ABCFactoryTest {

    @Mock
    private Context mockContext; // 提前Mock好要返回的Context对象

    @Test
    public void testMockFactoryStaticMethod() {
        // 1. Mock静态方法getFactory(),让它返回一个Mock的ABCFactory实例
        ABCFactory mockFactory = PowerMockito.mock(ABCFactory.class);
        PowerMockito.mockStatic(ABCFactory.class);
        PowerMockito.when(ABCFactory.getFactory()).thenReturn(mockFactory);

        // 2. 配置Mock实例的getContext方法,指定传入特定参数时返回我们的mockContext
        PowerMockito.when(mockFactory.getContext("test-authority")).thenReturn(mockContext);

        // 3. 执行测试逻辑(比如调用依赖ABCFactory的业务代码)
        Context result = ABCFactory.getFactory().getContext("test-authority");

        // 4. 验证结果和调用行为
        assert result == mockContext;
        PowerMockito.verifyStatic(ABCFactory.class); // 验证静态方法getFactory()被调用过
        ABCFactory.getFactory(); // PowerMock的验证规则:要重复一次待验证的静态方法调用
    }
}

关键细节提醒

  • @PrepareForTest(ABCFactory.class):必须加这个注解,PowerMock需要修改类字节码才能拦截静态方法调用。
  • PowerMockito.mockStatic(...):专门用来开启类的静态方法Mock模式。
  • 验证静态方法调用的方式有点特殊,先调用PowerMockito.verifyStatic(Class),再重复一次要验证的静态方法,这是PowerMock的规则。

如果你的需求是MockgetContext底层的createInstance方法,也可以用类似思路Mock父类方法,但上面的方式更直观——先Mock静态工厂返回Mock实例,再Mock实例方法,业务代码完全感知不到Mock的存在。

内容的提问来源于stack exchange,提问作者Shravan DG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:30