Как мне издеваться над универсальным методом, который принимает тип класса? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь написать модульный тест для клиента REST API. Я следую схеме, которая хорошо сработала для меня во множестве других модульных тестов. В частности, я успешно смоделировал зависимости, которые были введены в тестируемый репозиторий. Тем не менее, когда я придумываю Spring RestTemplate, я не могу найти способ заставить его getForObject() метод возвращать что-либо кроме null. Кто-нибудь знает как это сделать? Я подозреваю, что проблема может заключаться в том, что подпись для RestTemplate.getForObject() содержит обобщения:

public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException

Вот мой класс клиента REST, который я пытаюсь проверить:

@Repository
public class WebApplicationClient {
    private final RestTemplate template;
    public WebApplicationClient(RestTemplate template) {
        this.template = template;
    }
    public <T> T getData(String baseUrl, Class<T> clazz) {
        String endpoint = process(baseUrl);
        try {
            return template.getForObject(endpoint, clazz);  // Mock this call during testing
        } catch (HttpClientErrorException | HttpServerErrorException e) {
            String msg = "API call failed: " + endpoint;
            LOG.warn(msg, e);
            throw new WebApplicationException(e.getStatusCode(), msg, e);
        }
    }
}

Вот мой тестовый модуль. То, что я пробую для when(template.getForObject(...)), всегда возвращает null. Следовательно, result всегда null, и мое утверждение не выполняется.

public class WebApplicationClientUnitTests {
    @Mock private RestTemplate template;
    private WebApplicationClient client;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        client = new WebApplicationClient(template);
    }

    @Test
    public void getData_Test1() {
        // when(template.getForObject(any(), eq(String.class))).thenReturn("sample"); // Returns null
        when(template.getForObject(any(), any())).thenReturn("sample"); // Returns null

        String result = client.getData(TEST_URL, "db", expectedState, String.class);
        Assert.assertEquals("sample", result);
    }
}

Как мне заставить getForObject() вернуть фактическое значение?

1 Ответ

0 голосов
/ 08 января 2019
@Test
public void getData_Test1() {

    when(template.getForObject((String) any(),eq(String.class))).thenReturn("sample");
    //OR
    //when(template.getForObject((String) any(),(Class)any())).thenReturn("sample");
    //OR
    //when(template.getForObject(any(String.class), any(Class.class))).thenReturn("sample");

    String result = client.getData("TEST_URL", String.class);
    Assert.assertEquals("sample", result);
}

Вышеуказанный код отлично работает для меня.

...