如何在单元测试中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
相关产品推荐
相关产品推荐

