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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:15:04