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

问题描述 投票:0回答:1

我在一个代码库上工作,该代码库使用来自CXF发行版的标准“javax.ws.rs.client.ClientBuilder”类来配置和创建“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);

不幸的是,这在“org.apache.cxf.jaxrs.client.WebClient.getConfig(Object)”中的“Not a valid Client”失败了,因为它需要是“org.apache.cxf.jaxrs.client.Client”的实例,而不是javax.ws.rs.client.Client

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

jax-rs cxf
1个回答
1
投票

您可以使用ClientRequestFilters对JAX-RS客户端进行单元测试。基本上将自定义ClientRequestFilter注册到Client对象(或ClientBuilder),该对象使用传递给filter方法的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)

希望这会有所帮助,安迪

© www.soinside.com 2019 - 2024. All rights reserved.