2

使用 CXF 在 JAX-RS 客户端上工作。

要求是在测试客户端的帮助下从单元测试用例测试服务端代码,而不将其余服务部署到服务器

我们实现的 REST 服务使用 HTTP 标头将一些信息传递给 WS 方法。

到目前为止,我遇到的所有实现都将服务部署到服务器。

我尝试创建 JAX-RS 客户端的示例

        WebClient client = WebClient.create(ENDPOINT_ADDRESS);

RestWSInterafce proxy = JAXRSClientFactory.create(ENDPOINT_ADDRESS, RestWSInterafce.class);
    Client client = WebClient.client(proxy);
    WebClient httpClient = WebClient.fromClient(client);

我尝试配置 CXF-Jetty 实现,但没有任何运气。下面是 Spring 应用程序上下文文件的快照

 <import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />

<jaxrs:client id="restWSClient" address="${server.address}" serviceClass="com.xyz.rs.RestWSInterface">
</jaxrs:client>

是否可以在不将其余服务部署到服务器的情况下进行测试?


编辑

在发布这个问题时,我主要关心的是测试期望 HttpHeaders 元素在上下文中传递的方法。从我的界面考虑以下 GET 方法。

@GET
@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
@Path("/getMessage")
public Response getMessage(@Context HttpHeaders headers);

为了对这种方法进行单元测试,我没有通过将应用程序部署到服务器来调用接口,而是编写了测试用例,直接调用实现类并将实现器作为输入传递给 HttpHeader。这解决了我在不部署到服务器的情况下对 ws 方法进行单元测试的问题。

public class HttpHeadersImpl implements HttpHeaders {

private MultivaluedMap<String, String> multivaluedMap;

public void setRequestHeaders(MultivaluedMap<String, String> multivaluedMap) {
    this.multivaluedMap = multivaluedMap;
}

@Override
public MultivaluedMap<String, String> getRequestHeaders() {
    return multivaluedMap;
}
}
4

1 回答 1

1

您可以从单元测试中以编程方式启动 CXF 服务器,而无需部署到服务器中

JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(TestServiceImpl.class);
sf.setAddress("http://localhost:8080/testrs");
sf.create();  

要启动端点,您需要cxf-rt-transports-http-jetty dependency

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>3.1.6</version>
</dependency>

服务器可以是真实的,也可以是模拟的,仅用于测试。使用 WebClient,您可以测试 http 传输。

如果您使用 CXF 和 Spring,您还可以使用初始化完整上下文ClassPathXmlApplicationContext并将其余服务器注入单元测试客户端。在这种情况下,您可以在没有 http 传输的情况下测试服务

于 2016-06-30T06:29:08.383 回答