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

如何在单元测试中Mock HttpHeaders内部的MultivaluedMap

解决方案

你只需要在测试的beforeMethod方法里,给mock的HttpHeaders对象添加一个mock行为,让它的getRequestHeaders()方法返回你已经配置好的mockMultiHeaderMap即可。另外还要修复代码里的几个小问题,比如字符串引号缺失、测试方法缺少注解、待测试实例未初始化。

修改后的完整测试类代码如下:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;

public class TestDummy {

    // 初始化待测试实例,若AClass有依赖可结合@InjectMocks使用
    private AClass a = new AClass();
    private final HttpHeaders mockHeader = Mockito.mock(HttpHeaders.class);
    private final MultivaluedMap<String, String> mockMultiHeaderMap = 
        Mockito.mock(MultivaluedMap.class);

    @BeforeEach
    void beforeMethod(){
        // 配置mockMultiHeaderMap的返回值
        Mockito.when(mockMultiHeaderMap.getFirst("abc")).thenReturn("def");
        // 关键:让mockHeader的getRequestHeaders返回我们配置好的mockMultiHeaderMap
        Mockito.when(mockHeader.getRequestHeaders()).thenReturn(mockMultiHeaderMap);
    }

    // 添加@Test注解,否则测试方法不会被JUnit执行
    @Test
    void actualTestClass(){
        // 简化lambda写法,因为method是void类型
        assertDoesNotThrow(() -> a.method(mockHeader));
    }
}

关键点说明:

  • 关联mock对象:业务方法method中会调用headers.getRequestHeaders(),必须让mock的HttpHeaders返回你已经配置好的mockMultiHeaderMap,这样后续调用multiHeaderMap.getFirst("abc")才会拿到预设的"def"。
  • 修复代码问题:
    • 补全thenReturn("def")的闭合引号;
    • 给测试方法添加@Test注解,确保JUnit能识别并执行;
    • 初始化AClass的实例a,避免调用a.method()时抛出空指针异常;
    • 由于method是void方法,断言里的lambda可以简化,无需返回值。

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:10:47