У меня есть класс, который имеет прямую зависимость от RestTemplate. Я бы хотел, чтобы у меня был тест JUnit в автономном режиме.
Как я могу издеваться над RestTemplate в своем модульном тесте?
У меня есть класс, который имеет прямую зависимость от RestTemplate. Я бы хотел, чтобы у меня был тест JUnit в автономном режиме.
Как я могу издеваться над RestTemplate в своем модульном тесте?
Я предлагаю реорганизовать ваш клиентский код, чтобы удалить прямую зависимость от RestTemplate
и заменить ее ссылками на RestOperations
, который представляет собой интерфейс, реализованный RestTemplate
. и тот, на который вы должны кодировать.
Затем вы можете внедрить заглушку или макет RestOperations
в свой код для модульного тестирования и внедрить RestTemplate
при его реальном использовании.
RestTemplate
используется практически ВЕЗДЕ, где Google приведет вас, даже MockRestServiceServer
(как указал @Raedwald). Кроме того, документация Javadoc для состояния RestOperations
нечасто используется напрямую, но является полезной опцией для улучшения тестируемости, поскольку ее можно легко имитировать или заглушить.
- person demaniak; 15.03.2016
RestOperations
, а экземпляр потребляется реализацией Service
(тестируемый класс), как бы вы поместили фиктивный экземпляр RestOperations
в службу? Создать экземпляр службы непосредственно в тесте и использовать установщик?
- person demaniak; 15.03.2016
RestTemplate
, но довольно сложно реализовать все RestOperations
многие методы.
- person Michael Piefel; 12.07.2016
В версии Spring 3.0 представлено RestTemplate
. Начиная с версии 3.2, Spring Платформа тестирования MVC предоставила класс MockRestServiceServer
для модульного тестирования REST-кода клиента.
Вы можете использовать классы Mock в пакете org.springframework.mock.web
.
Обычно вам потребуется MockHttpServletRequest
и MockHttpServletResponse
, но если вам нужно больше контроля, вам также могут понадобиться другие, например. MockRequestDispatcher
.
Оба они реализуют соответствующие интерфейсы сервлетов, но добавляют удобные методы для тестирования (и, что наиболее важно: они работают без реального HTTP-соединения).
Вы можете найти классы Mock в jar-файле spring-test (доступном через Maven )
Обновление: кажется, что приведенные выше классы не очень помогают для RestTemplate
. Вам потребуется создать макет ClientHttpRequestFactory
, и я удивлен, увидев, что в приведенном выше пакете его нет. Вот код для начала (не проверял):
public class MockClientHttpRequestFactory implements
ClientHttpRequestFactory{
// overwrite this if you want
protected MockClientHttpResponse createResponse(){
return new MockClientHttpResponse();
}
// or this
protected HttpStatus getHttpStatusCode(){
return HttpStatus.OK;
}
// or even this
@Override
public ClientHttpRequest createRequest(final URI uri,
final HttpMethod httpMethod) throws IOException{
return new MockClientHttpRequest(uri, httpMethod);
}
public class MockClientHttpResponse implements ClientHttpResponse{
private final byte[] data = new byte[10000];
private final InputStream body = new ByteArrayInputStream(data);
private final HttpHeaders headers = new HttpHeaders();
private HttpStatus status;
@Override
public InputStream getBody() throws IOException{
return body;
}
@Override
public HttpHeaders getHeaders(){
return headers;
}
@Override
public HttpStatus getStatusCode() throws IOException{
return getHttpStatusCode();
}
@Override
public String getStatusText() throws IOException{
return status.name();
}
@Override
public void close(){
try{
body.close();
} catch(final IOException e){
throw new IllegalStateException(e);
}
}
}
class MockClientHttpRequest implements ClientHttpRequest{
private final HttpHeaders headers = new HttpHeaders();
private final HttpMethod method;
private final URI uri;
private final OutputStream body = new ByteArrayOutputStream();
MockClientHttpRequest(final URI uri, final HttpMethod httpMethod){
this.uri = uri;
method = httpMethod;
}
@Override
public OutputStream getBody() throws IOException{
return body;
}
@Override
public HttpHeaders getHeaders(){
return headers;
}
@Override
public HttpMethod getMethod(){
return method;
}
@Override
public URI getURI(){
return uri;
}
@Override
public ClientHttpResponse execute() throws IOException{
return createResponse();
}
}
}
getStatusCode
и getStatusText
в MockClientHttpResponse
немного страдают шизофренией. Пусть getStatusText(){return this.getStatusCode().name();}
исцелит их. ;-)
- person Ralph; 08.02.2012
spring-social-test содержит макеты классов, которые помогают писать тесты для RestTemplate
. Есть также несколько примеров того, как использовать его в репозитории git (например, OAuth1TemplateTest).
Имейте в виду, что в настоящее время существует запрос функции Spring (#SPR-7951) для перемещения эти классы в spring-web.