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

