使用Mockito-inline 3.6.28如何Mock静态void方法?求参考示例
Mock静态void方法实现(适配Mockito-inline 3.6.28)
Mockito-inline 3.6.28 原生支持静态方法Mock,不需要引入PowerMock等额外依赖,静态void方法的Mock逻辑和有返回值的静态方法略有区别,以下是可直接运行的实现示例。
前置准备
确保项目中没有同时引入版本不一致的mockito-core依赖,mockito-inline与mockito-core版本必须完全对齐,避免出现Mock初始化失败的问题。
完整代码示例
首先给出包含静态void方法的测试目标类:
// 待测试的工具类,包含静态void方法 public class CommonStaticUtil { public static void processData(String bizId, Integer status) { // 真实逻辑包含外部RPC调用、数据库操作等测试时需要跳过的副作用逻辑 System.out.println("真实方法被触发,业务ID:" + bizId); throw new UnsupportedOperationException("真实方法执行会抛出异常"); } }
对应的测试用例代码:
import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; public class StaticVoidMethodTest { @Test public void testMockStaticVoid() { // 开启静态类Mock,try-with-resources会在代码块执行结束后自动关闭Mock作用域,避免污染其他测试用例 try (MockedStatic<CommonStaticUtil> staticMock = mockStatic(CommonStaticUtil.class)) { // 场景1:默认行为,Mock后静态void方法会直接跳过原逻辑,不执行任何操作 // 执行下面的代码不会触发原方法的打印和异常 CommonStaticUtil.processData("biz001", 1); // 场景2:自定义Mock逻辑,比如记录入参、抛出指定异常 staticMock.when(() -> CommonStaticUtil.processData(anyString(), anyInt())) .thenAnswer(invocation -> { // 提取方法入参做自定义校验 String bizId = invocation.getArgument(0); Integer status = invocation.getArgument(1); System.out.println("Mock方法被调用,入参bizId:" + bizId + ",status:" + status); // 按需抛出指定异常,模拟方法执行失败场景 // throw new IllegalArgumentException("参数不合法"); return null; // void方法固定返回null即可 }); // 场景3:指定静态void方法执行真实逻辑 // staticMock.when(() -> CommonStaticUtil.processData(anyString(), anyInt())) // .thenCallRealMethod(); // 执行业务测试逻辑 CommonStaticUtil.processData("biz002", 2); // 验证方法调用行为 // 验证方法总共被调用2次(场景1调用1次,业务逻辑调用1次) staticMock.verify(() -> CommonStaticUtil.processData(anyString(), anyInt()), times(2)); // 验证指定入参的调用是否存在 staticMock.verify(() -> CommonStaticUtil.processData("biz001", 1), times(1)); } } }
常见踩坑说明
- 不要套用普通实例void方法的
doNothing().when(obj)写法,静态void方法必须放在MockedStatic实例的when()方法入参lambda中,否则会直接触发真实方法执行。 - 必须用try-with-resources包裹
MockedStatic实例,不要手动在@BeforeEach/@AfterEach中手动开关静态Mock,很容易因为异常导致Mock未关闭,污染其他测试用例。 - 3.6.28版本默认不支持Mock JDK核心类(比如
System.currentTimeMillis、LocalDateTime.now等),如果需要Mock这类方法要额外添加JVM启动参数,业务自定义类、第三方依赖类的静态void方法都可以正常Mock。
内容的提问来源于stack exchange,提问作者Ayush Maheshwari
相关产品推荐
相关产品推荐

