我有一个直接依赖rettemplate的课程。我希望我有一个少年测试,离线。

我如何在我的UNITDEST中嘲笑RESTTEMPLATE?

有帮助吗?

解决方案

我建议将您的客户代码重构 消除 直接依赖 RestTemplate, ,并将其替换为参考 RestOperations, ,这是由 RestTemplate. 。以及您应该编码的。

然后您可以注入存根或模拟 RestOperations 进入您的代码进行单元测试,并注入 RestTemplate 当它用于真实时。

其他提示

介绍了Sping 3.0 RestTemplate. 。自3.2版以来, 春季MVC测试框架 提供了班级 MockRestServiceServer 用于单元测试客户端ret代码。

您可以在包装中使用模拟类 org.springframework.mock.web.

通常你需要 MockHttpServletRequestMockHttpServletResponse, ,但是,如果您需要更多的控制权,则可能需要其他人,例如 MockRequestDispatcher.

这两个都实现了相应的servlet接口,但添加了用于测试的便利方法(最重要的是:它们在没有真正的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