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
相关产品推荐
相关产品推荐

