如何使用RESTTEMPLATE脱机来匹配课程?
-
09-10-2019 - |
题
我有一个直接依赖rettemplate的课程。我希望我有一个少年测试,离线。
我如何在我的UNITDEST中嘲笑RESTTEMPLATE?
解决方案
我建议将您的客户代码重构 消除 直接依赖 RestTemplate
, ,并将其替换为参考 RestOperations
, ,这是由 RestTemplate
. 。以及您应该编码的。
然后您可以注入存根或模拟 RestOperations
进入您的代码进行单元测试,并注入 RestTemplate
当它用于真实时。
其他提示
介绍了Sping 3.0 RestTemplate
. 。自3.2版以来, 春季MVC测试框架 提供了班级 MockRestServiceServer
用于单元测试客户端ret代码。
您可以在包装中使用模拟类 org.springframework.mock.web
.
通常你需要 MockHttpServletRequest
和 MockHttpServletResponse
, ,但是,如果您需要更多的控制权,则可能需要其他人,例如 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。