我正在开发一个使用标准的代码库“javax.ws.rs.client.ClientBuilder
“类,来自 CXF 发行版,用于配置和创建”javax.ws.rs.client.Client
".
这已经足够好了。
我现在正在尝试编写使用的测试JAXRSServerFactoryBean
使用内联类定义的控制器来管理假服务器。我可以在测试和客户端配置中将我的 host:port 设置为 localhost:something,这足以让我测试我们的 MessageBodyReaders 和 Http 异常处理。
但是,我认为这不会是“可扩展的”,因为每个假服务器都必须在“专用”端口上运行(至少在运行测试时)。我可以尝试使用不常见的端口,并让不同的测试使用不同的端口,或者使用随机数,但这都有一定的风险。我真的不希望 CI 构建失败,因为并行运行的测试最终使用相同的端口。
我读到了 CXF(不是 JAX-RS)使用“本地传输”的能力(https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing)。看来这可能会解决我的问题。我需要验证这一点,但使用本地传输并行运行的两个测试可能不会发生冲突。
然而,我什至还无法让它工作,因为我们的客户端代码使用的是“标准”JAX-RS 客户端类,而不是 CXF 客户端类。它们看起来不同且不相容。
在创建客户端时,我尝试这样做(只是为了看看它是否可以工作):
WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
不幸的是,这失败了,并显示“不是有效的客户端”org.apache.cxf.jaxrs.client.WebClient.getConfig(Object)
“因为它需要是一个实例”org.apache.cxf.jaxrs.client.Client
", not javax.ws.rs.client.Client
.
这里有任何简单(甚至可能)的前进道路吗?
您可以使用客户端请求过滤器 https://jax-rs.github.io/apidocs/2.1/javax/ws/rs/client/ClientRequestFilter.html对 JAX-RS 客户端进行单元测试。基本上将自定义 ClientRequestFilter 注册到您的 Client 对象(或 ClientBuilder),该对象使用以下方式模拟您的响应abortWith(Response)
方法上的ClientRequestContext
传递给过滤器方法的对象。
像这样的东西应该有效:
public MyMockRequestFilter implements ClientRequestFilter {
@Override
public void filter(ClientRequestContext requestContext) {
MyEntity entity = // get the entity you want to mock as returned from the server
requestContext.abortWith(Request.ok(entity).build());
}
}
...
ClientBuilder builder = ClientBuilder.newBuilder().register(MyMockRequestFilter .class)
希望这可以帮助,
安迪
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)