Java Mockito с RestTemplate.exchange с использованием Generics - PullRequest
0 голосов
/ 02 мая 2019

У меня есть универсальный метод, который вызывает указанный URL-адрес, используя RestTemplate.exchange.Сам метод работает и загружает данные нормально, но я не могу выполнить его модульное тестирование с использованием 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()));
    }
}

Unit Test

@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 с версией дженерика.

Что не так или отсутствует?

1 Ответ

2 голосов
/ 02 мая 2019

Последний подстановочный знак, который вы определили как: any(Class.class).

Метод обмена имеет подпись:

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

Вы должны определить его как: any(ParameterizedTypeReference.class)

Также я бы предложил заменить очень расплывчатые any() set-us на any(Class) эквиваленты.

...