我有一个通用方法,该方法使用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());
}
}
如果我使用非通用版本,那么一切正常,但是嘲笑会使用通用版本返回NullPointerException
。
出什么问题或遗漏了什么?
答案 0 :(得分:2)
您最后定义的通配符为:any(Class.class)
。
交换方法具有签名:
exchange(String url,
HttpMethod method,
HttpEntity<?> requestEntity,
ParameterizedTypeReference<T> responseType) throws RestClientException
您应将其定义为:any(ParameterizedTypeReference.class)
我还建议用any()
等价物替换非常模糊的any(Class)
设置。