Я пытаюсь написать модульный тест для клиента 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()
вернуть фактическое значение?