如何正确Mock WebClient.post中的ParameterizedTypeReference.forType(String.class)?
正确Mock WebClient.post中的ParameterizedTypeReference
问题根源
你当前的Mock写法有两个核心问题:
- 直接
new ParameterizedTypeReference<String> {}和业务代码里ParameterizedTypeReference.forType(String.class)生成的实例不相等——forType是工厂方法,内部有自己的实例创建逻辑,直接new的匿名子类无法匹配。 - 用
null作为第二个参数的匹配条件,和实际调用时传入的request参数不匹配,导致Mockito无法找到对应的Mock方法,触发参数非空校验异常。
正确Mock方案
方案1:复用相同的ParameterizedTypeReference实例
提前创建和业务代码完全一致的实例,用它来做匹配:
// 先创建和业务代码一致的类型引用实例 ParameterizedTypeReference<String> stringTypeRef = ParameterizedTypeReference.forType(String.class); // 编写Mock逻辑,第二个参数用any()匹配任意request,返回合法的响应对象 Mockito.when(WebClient.post(Mockito.anyString(), Mockito.any(), Mockito.eq(stringTypeRef))) .thenReturn(Mono.just(ResponseEntity.ok("mock response")));
方案2:用参数匹配器判断类型
如果不想提前创建实例,可以用argThat匹配器判断类型引用的实际类型:
Mockito.when(WebClient.post(Mockito.anyString(), Mockito.any(), Mockito.argThat(typeRef -> typeRef.getType().equals(String.class)))) .thenReturn(Mono.just(ResponseEntity.ok("mock response")));
注意事项
- 不要用
thenReturn(nothing),WebClient的post方法返回的是Mono<ResponseEntity<String>>,必须返回合法的Mono实例,否则会触发空指针或类型转换异常。 - 确保WebClient实例本身已经被正确Mock初始化。
内容的提问来源于stack exchange,提问作者tacu
相关产品推荐
相关产品推荐

