使用泛型与RestTemplate.exchange的Java Mockito

时间:2019-05-02 10:22:55

标签: java spring unit-testing junit mockito

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

出什么问题或遗漏了什么?

1 个答案:

答案 0 :(得分:2)

您最后定义的通配符为:any(Class.class)

交换方法具有签名:

exchange(String url,
             HttpMethod method,
             HttpEntity<?> requestEntity,
             ParameterizedTypeReference<T> responseType) throws RestClientException

您应将其定义为:any(ParameterizedTypeReference.class)

我还建议用any()等价物替换非常模糊的any(Class)设置。