我在一个代码库上工作,该代码库使用来自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
。
这里有任何简单(甚至可能)的路径吗?
您可以使用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)
希望这会有所帮助,安迪