복붙노트

[SPRING] RestTemplate을 오프라인으로 사용하여 클래스를 unittest하는 방법은 무엇입니까?

SPRING

RestTemplate을 오프라인으로 사용하여 클래스를 unittest하는 방법은 무엇입니까?

RestTemplate에 직접 의존하는 클래스가 있습니다. 오프라인에서 JUnit 테스트를하고 싶습니다.

어떻게 UnitTest에서 RestTemplate을 조롱 할 수 있습니까?

해결법

  1. ==============================

    1.RestTemplate에 대한 직접 종속성을 제거하고 RestTemplate에 의해 구현 된 인터페이스 인 RestOperations에 대한 참조로 바꾸기 위해 클라이언트 코드를 리팩터링하는 것이 좋습니다. 그리고 코딩해야하는 코드.

    RestTemplate에 대한 직접 종속성을 제거하고 RestTemplate에 의해 구현 된 인터페이스 인 RestOperations에 대한 참조로 바꾸기 위해 클라이언트 코드를 리팩터링하는 것이 좋습니다. 그리고 코딩해야하는 코드.

    그런 다음 단위 테스트를 위해 RestOperations의 스텁이나 모의 객체를 코드에 삽입 할 수 있으며, 실제 사용할 때 RestTemplate을 삽입 할 수 있습니다.

  2. ==============================

    2.Spring 3.0에서는 RestTemplate을 도입했습니다. 버전 3.2부터 스프링 MVC 테스트 프레임 워크는 단위 테스트 클라이언트 REST 코드 용 MockRestServiceServer 클래스를 제공했다.

    Spring 3.0에서는 RestTemplate을 도입했습니다. 버전 3.2부터 스프링 MVC 테스트 프레임 워크는 단위 테스트 클라이언트 REST 코드 용 MockRestServiceServer 클래스를 제공했다.

  3. ==============================

    3.org.springframework.mock.web 패키지의 Mock 클래스를 사용할 수있다.

    org.springframework.mock.web 패키지의 Mock 클래스를 사용할 수있다.

    일반적으로 MockHttpServletRequest와 MockHttpServletResponse가 필요할 것입니다. 그러나 더 많은 제어가 필요하면 다른 것들이 필요할 수도 있습니다. MockRequestDispatcher.

    이 두 가지 모두 해당 서블릿 인터페이스를 구현하지만 테스트를위한 편리한 방법을 추가합니다 (가장 중요한 것은 실제 HTTP 연결없이 작동 함).

    모의 수업은 스프링 테스트 병 (Maven을 통해 액세스 가능)에서 찾을 수 있습니다.

    업데이트 : 위 클래스는 RestTemplate에 별 도움이되지 않는 것 같습니다. 당신이 필요로하는 것은 mock 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();
            }
    
        }
    
    
    }
    
  4. ==============================

    4.spring-social-test에는 RestTemplate에 대한 테스트 작성에 도움이되는 mockup 클래스가 포함되어 있습니다. git 저장소 (예 : OAuth1TemplateTest)에서이를 사용하는 방법에 대한 몇 가지 예가 있습니다.

    spring-social-test에는 RestTemplate에 대한 테스트 작성에 도움이되는 mockup 클래스가 포함되어 있습니다. git 저장소 (예 : OAuth1TemplateTest)에서이를 사용하는 방법에 대한 몇 가지 예가 있습니다.

    이 클래스들을 spring-web으로 옮기기위한 Spring 기능 요청 (# SPR-7951)이 현재 있음을 명심하십시오.

  5. from https://stackoverflow.com/questions/4643105/how-to-unittest-a-class-using-resttemplate-offline by cc-by-sa and MIT license