如何用JUnit 5测试含自定义对象返回值的静态方法并跳过依赖方法
如何在单元测试中跳过Demo.processMethod里的静态方法执行
你要跳过的Demo1.processMethod1和Demo2.processMethod2是静态方法,普通对象mock无法处理,得用Mockito的mockStatic功能(需要Mockito 3.4.0及以上版本,且要引入mockito-inline依赖)。
1. 添加依赖
如果用Maven,在pom.xml中加入:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency>
如果用Gradle:
testImplementation 'org.mockito:mockito-core:4.11.0' testImplementation 'org.mockito:mockito-inline:4.11.0'
2. 编写单元测试代码
import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import static org.mockito.Mockito.*; public class DemoTest { @Test void testProcessMethod() { // 用try-with-resources创建静态mock,自动管理生命周期 try (MockedStatic<Demo1> mockedDemo1 = mockStatic(Demo1.class); MockedStatic<Demo2> mockedDemo2 = mockStatic(Demo2.class)) { // 可选:明确指定静态方法的空行为(默认就是空实现,这步可省略) mockedDemo1.when(() -> Demo1.processMethod1(anyString(), anyString())) .thenReturn(Void.TYPE); mockedDemo2.when(() -> Demo2.processMethod2(anyString(), anyString())) .thenReturn(Void.TYPE); // 调用待测试的方法 CustomObject result = Demo.processMethod("testStr1", "testStr2"); // 可选:验证静态方法是否被调用(根据测试需求选择) mockedDemo1.verify(() -> Demo1.processMethod1("testStr1", "testStr2")); mockedDemo2.verify(() -> Demo2.processMethod2("testStr1", "testStr2")); // 这里添加你的断言逻辑,比如检查返回结果是否符合预期 // assertNotNull(result); // assertEquals("预期值", result.getSomeField()); } // 离开try块后静态mock自动关闭,不会污染其他测试用例 } }
关键说明
- 必须通过
try-with-resources或手动调用close()方法关闭MockedStatic,否则静态mock会残留于JVM中,影响其他测试。 - 若仅需跳过静态方法执行、无需验证调用情况,直接创建
MockedStatic实例即可,不用写when配置,mock后的静态方法默认不会执行原有逻辑。 - 若使用JUnit 4,测试注解换成
org.junit.Test,并在@After方法中手动关闭MockedStatic实例。
内容的提问来源于stack exchange,提问作者Pavan G
相关产品推荐
相关产品推荐

