Как разрядить класс, используя rettemplate в автономном режиме?
-
09-10-2019 - |
Вопрос
У меня есть класс, который имеет прямую зависимость от Resttemplate. Я бы хотел, чтобы у меня есть герметичный тест, офлайн.
Как я могу издеваться на ресторану в моем неtiettest?
Решение
Я предлагаю рефакторировать код вашего клиента к Удалить прямая зависимость на RestTemplate
, и заменить его ссылками на RestOperations
, который является интерфейсом, реализованным RestTemplate
. Отказ и тот, к которому вы должны кодировать.
Затем вы можете ввести заглушку или издевательство RestOperations
в ваш код для тестирования подразделения, и введите RestTemplate
При использовании его для реального.
Другие советы
SPING 3.0 представлен RestTemplate
. Отказ С версии 3.2, Весна MVC Test Framework предоставил класс MockRestServiceServer
для блока тестирования клиента код отдыха.
Вы можете использовать макет классов в пакете org.springframework.mock.web
.
Обычно вам понадобится MockHttpServletRequest
а также MockHttpServletResponse
, но если вам нужно больше контроля, вам также может понадобиться другие, например MockRequestDispatcher
.
Оба из них реализуют соответствующие интерфейсы сервлета, но добавляют удобные методы для тестирования (и, главное: они работают без реального HTTP-соединения).
Вы можете найти классы издевательства в весенне-тестовой банке (доступен через 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();
}
}
}
промежуточный тест Содержит классы макета, которые помогают писать тесты для RestTemplate
. Отказ Есть также несколько примеров о том, как использовать его в репозитории Git (например, Oauth1templatetest).
Пожалуйста, имейте в виду, что в настоящее время есть запрос на функцию пружины (# SPR-7951) Чтобы переместить эти классы для Spring-Web.