使用CXF中的javax.ws.rs.client.ClientBuilder创建Client,能够使用本地传输的任何路由?

时间:2018-01-13 00:44:37

标签: jax-rs cxf

我在使用标准" javax.ws.rs.client.ClientBuilder"的代码库上工作。来自CXF发行版的类,用于配置和创建" javax.ws.rs.client.Client"。

这很好用。

我现在正在尝试编写使用JAXRSServerFactoryBean来使用内联类定义的控制器来管理虚假服务器的测试。我可以将我的host:port设置为localhost:在测试和客户端配置中都可以使用,这样就足以让我测试我们的MessageBodyReaders和Http异常处理。

然而,我认为这不可能是"可扩展的",因为每个假的服务器都必须在"专用的"端口(至少运行测试时)。我可以尝试使用不常见的端口,并使用不同的端口进行不同的测试,或使用随机数,但这些都有些风险。我并不真的希望CI构建失败,因为并行运行的测试最终使用相同的端口。

我读到了CXF(而不是JAX-RS)使用"本地传输" (https://cwiki.apache.org/confluence/display/CXF20DOC/JAXRS+Testing)。似乎可以解决我的问题。我需要验证这一点,但是使用本地传输并行运行的两个测试可能不会发生冲突。

但是,我甚至无法使用它,因为我们的客户端代码正在使用"标准" JAX-RS客户端类,而不是CXF客户端类。它们似乎不同且不相容。

在我创建客户端时,我尝试这样做(只是为了看它是否可以工作):

WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);

不幸的是,这失败了"不是有效的客户" in" org.apache.cxf.jaxrs.client.WebClient.getConfig(Object)"因为它需要是" org.apache.cxf.jaxrs.client.Client"的实例,而不是javax.ws.rs.client.Client

这里有任何简单(甚至可能)的路径吗?

1 个答案:

答案 0 :(得分:1)

您可以使用ClientRequestFilters对JAX-RS客户端进行单元测试。基本上将自定义ClientRequestFilter注册到Client对象(或ClientBuilder),该对象使用传递给过滤器方法的for对象上的abortWith(Response)方法来模拟您的响应。

这样的事情应该有效:

ClientRequestContext

希望这有帮助, 安迪