我有一个通用方法,该方法使用RestTemplate.exchange
调用指定的URL。方法本身正常工作和加载数据,但我无法使用Mockito进行单位测试。
主方法
@Service
public class MyClass{
private <T> List<T> loadData(String url) {
return restTemplate.exchange(
url, GET, null, new ParameterizedTypeReference<List<T>>(){}
).getBody().stream().collect(toList()));
}
}
单元测试
@Runwith(MockitoJUnitRunner.class)
public class MyTest {
@Mock
private RestTemplate restTemplate;
@Test
public void givenCall_myMethod_WillReturnData(){
given(restTemplate.exchange(
ArgumentMatchers.anyString(), ArgumentMatchers.any(), any(), any(Class.class)
))
.willReturn(bodyData());
}
}
如果我使用非生成版本,那么一切都很好,但是Mockito返回带有通用版本的NullPointerException
。
有什么问题或缺失?
您定义为:any(Class.class)
。
交换方法具有签名:
exchange(String url,
HttpMethod method,
HttpEntity<?> requestEntity,
ParameterizedTypeReference<T> responseType) throws RestClientException
您应该将其定义为:any(ParameterizedTypeReference.class)
我也建议用 any(Class)
等效替换非常模糊的 any()
set-us。