使用@RunWith(MockitoJUnitRunner.class)时如何Mock静态方法调用
解决方案
Mockito 3.4.0及以上版本已经原生支持静态方法Mock,无需切换到PowerMockRunner,完全兼容@RunWith(MockitoJUnitRunner.class)的使用场景,以下是两种可落地的实现方案:
方案1:使用Mockito原生静态Mock(推荐,需Mockito≥3.4.0)
步骤1:确认依赖版本
首先保证测试依赖的Mockito版本符合最低要求,Maven依赖配置示例:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <!-- 最低支持3.4.0,建议使用最新稳定版 --> <scope>test</scope> </dependency>
Gradle依赖配置示例:
testImplementation 'org.mockito:mockito-core:4.11.0'
步骤2:编写测试逻辑
Mockito.mockStatic()是作用域绑定的,建议搭配try-with-resources使用,自动释放静态Mock避免影响其他测试用例,示例代码如下:
import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockedStatic; import org.mockito.junit.MockitoJUnitRunner; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class YourServiceTest { @Test public void testYourBizMethod() { // 构造期望返回的Mock配置实例 MosConfig mockConfig = new MosConfig(); // 可按需给mockConfig设置测试需要的属性值 // 开启MosConfigFactory类的静态Mock作用域 try (MockedStatic<MosConfigFactory> mockedStatic = mockStatic(MosConfigFactory.class)) { // 定义静态方法调用的返回值 mockedStatic.when(MosConfigFactory::getInstance).thenReturn(mockConfig); // 此处执行业务测试逻辑,代码内部调用MosConfigFactory.getInstance()会返回上面构造的mockConfig // yourService.doBizAction(); // 可选:验证静态方法是否被调用了指定次数 mockedStatic.verify(MosConfigFactory::getInstance); } // 出了try块后,静态方法自动恢复原有逻辑,不会污染其他测试用例 } }
注意:静态Mock默认是线程封闭的,仅在当前测试线程内生效,如果你的业务逻辑存在多线程调用静态方法的场景,需要在对应子线程内单独开启静态Mock作用域。
方案2:适配层封装(兼容Mockito<3.4.0的老版本)
如果无法升级Mockito版本,可以通过封装静态调用的方式绕开静态Mock的需求,不需要修改原有工具类逻辑,侵入性极低:
步骤1:新增静态调用适配层
// 业务代码新增适配层,仅做静态方法转发,无额外逻辑 @Component // 若使用Spring可直接注入,否则手动实例化也可 public class MosConfigProvider { public MosConfig getInstance() { return MosConfigFactory.getInstance(); } }
步骤2:替换业务代码调用
原有直接调用MosConfigFactory.getInstance()的位置,改为注入MosConfigProvider后调用mosConfigProvider.getInstance()。
步骤3:测试时Mock适配层即可
@RunWith(MockitoJUnitRunner.class) public class YourServiceTest { @Mock private MosConfigProvider mosConfigProvider; @InjectMocks private YourService yourService; @Test public void testYourBizMethod() { MosConfig mockConfig = new MosConfig(); when(mosConfigProvider.getInstance()).thenReturn(mockConfig); // 直接执行业务逻辑测试即可 yourService.doBizAction(); } }
内容的提问来源于stack exchange,提问作者Peter Osta
相关产品推荐
相关产品推荐

