Как разрядить класс, используя rettemplate в автономном режиме?

StackOverflow https://stackoverflow.com/questions/4643105

Вопрос

У меня есть класс, который имеет прямую зависимость от 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top