使用RESTTEMPLATE.SEXCHANGE使用generics



我有一个通用方法,该方法使用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。

相关内容

  • 没有找到相关文章

最新更新