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

Mockito测试Spring RestTemplate时存根参数不匹配问题

解决Mockito存根参数不匹配问题

错误原因

你的测试代码中对restTemplate.exchange的存根参数与实际调用不匹配:

  • 实际调用时,最后一个可变参数uriVariables是空数组(原代码未传递该参数)
  • 但你在存根时用了Optional.ofNullable(any())作为最后一个参数,这和实际参数的类型、值完全不匹配,触发了Mockito的严格存根检查报错。

修正方案

修改测试中的存根代码,确保参数与实际调用的方法签名匹配:

方案1:宽松匹配所有参数

@ExtendWith(MockitoExtension.class)
public class TokenIntrospectorTest {

    @InjectMocks
    private TokenIntrospector tokenIntrospector;

    @Mock
    RestTemplate restTemplate;

    @Test
    public void test() {
        // 修正存根参数,去掉错误的Optional部分,用any(Object[].class)匹配可变参数
        when(restTemplate.exchange(
                anyString(),
                any(HttpMethod.class),
                any(HttpEntity.class),
                any(Class.class),
                any(Object[].class)
        )).thenReturn(ResponseEntity.ok(new UserInfo("a")));

        String introspect = tokenIntrospector.introspect("data");
        // 可添加断言验证结果:assertEquals("a", introspect);
    }
}

方案2:精确匹配参数(可选)

如果需要验证请求的具体细节,可以构建预期请求对象进行精确匹配:

@Test
public void test() {
    // 构建与实际代码一致的请求头
    MultiValueMap<String, String> expectedHeaders = new LinkedMultiValueMap<>();
    expectedHeaders.set("Accept", "application/json");
    expectedHeaders.set("Authorization", "Bearer data");
    HttpEntity<UserInfo> expectedRequest = new HttpEntity<>(expectedHeaders);

    // 精确匹配所有参数
    when(restTemplate.exchange(
            eq("http://localhost"),
            eq(HttpMethod.GET),
            eq(expectedRequest),
            eq(UserInfo.class),
            any(Object[].class)
    )).thenReturn(ResponseEntity.ok(new UserInfo("a")));

    String introspect = tokenIntrospector.introspect("data");
    assertEquals("a", introspect);
}

关键注意点

  • 存根参数必须严格对应原方法的参数类型,禁止使用不匹配的类型(比如这里错误的Optional)。
  • 对于可变参数Object... uriVariables,用any(Object[].class)即可匹配空数组或任意传入的数组。
  • 若无需精确验证参数,使用any()系列匹配器即可满足测试需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:53:13