扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:builder.com.cn 2007年5月22日
关键字:
图3创建客户端代码存根
指定WSDL文件的位置,存根代码的输出地址及对应的类包,点击Finish。
图4生成的代码
BbtForumServiceClient是BbtForumServicePortType的工厂类,它提供了若干个获取BbtForumServicePortType实例的重载方法。BbtForumServicePortType对应服务端的窄接口BbtForumService类。而BbtForumServiceImpl是服务端的存根代码,在META-INF中还有XFire的服务配置文件。对于客户端来说,一般不需要服务端的代码,所以你可以将BbtForumServiceImpl和META-INF删除。
下面,我们利用XFire生成的BbtForumServiceClient对服务端的Web Service进行调用:
package com.baobaotao.xfire.client;
public class StubClient {
public static void main(String[] args) {
BbtForumServiceClient client = new BbtForumServiceClient();
String serviceUrl = "http://localhost:8080/baobaotao/service/BbtForumService";
①获取对应服务窄接口实例
BbtForumServicePortType portType = client.getBbtForumServiceHttpPort(serviceUrl);
int count = portType.getRefinedTopicCount(20);②对服务进行调用
System.out.println("count:" + count);
}
}
我们首先实例化一个BbtForumServiceClient,然后通过URL指定Web Service的服务地址,然后创建一个服务的窄接口实例,如①所示,接着我们就可以使用这个窄接口实例进行Web Service服务的调用了。
Web Service的测试
在上一节里,我们学习了客户端调用服务端中Web Service的方法。在实际应用中,在开放Web Service之前需要进行严格的测试,以保证功能的正确性。在一般框架中,测试Web Service往往这是一个炼狱般痛苦的过程。
XFire通过AbstractXFireTest极大地简化Web Service的测试。AbstractXFireTest允许我们无需构造客户端调用程序,在SOAP报文层面开展对服务端代码的测试,AbstractXFireTest提供了一系列方便的方法对SOAP报文进行验证。XFire还特别为Spring环境下进行Web Service测试提供了一个AbstractXFireSpringTest子类,仅通过启用Spring容器就可以完成Web Service的测试。通过XFire精心设计的测试工具类,对Web Service的测试工作已经是一项可以轻松应对的工作。
如果你在编写服务端Web Service的同时,还需要编写客户端调用程序,这时不可避免的,你希望从客户端角度对Web Service进行测试。由于客户端程序需要访问真实的Web Service,所以需要开启Web服务器,让服务端的Web Service能够提供服务共客户端访问调用。如果客户端和服务端都在同一个项目中开发,XFire允许你在不启动Web服务器的情况下测试客户端程序,其原理是让Web Service运行于JVM模式下。
基于SOAP报文的纯服务端测试
AbstractXFireTest扩展于JUnit标准的TestCase类,提供了向某个Web Service发送SOAP请求报文并对返回的SOAP响应报文进行检验的能力。该测试类提供了若干个方便的断言方法,分别介绍如下:
AbstractXFireSpringTest是AbstractXFireTest的子类,在Spring中你仅需要扩展该类并实现该类的抽象方法ApplicationContext createContext(),就可以对Spring容器中用XFire定义的Web Service进行测试了。
为了测试Web Service,我们必须准备一个SOAP请求报文,你可以简单地手工编写一个,或通过SOAP报文截取工具(如前面我们介绍的TcpTrace、SOAPScope、Apache Axis的TCPMon等)获得一些可用的SOAP请求报文。下面是一个访问BbtForumService 服务的请求SOAP报文:
代码清单6 request_soap.xml:SOAP报文层面测试
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<getRefinedTopicCount
xmlns="http://server.xfire.baobaotao.com">
<in0 xmlns="http://server.xfire.baobaotao.com">20</in0>
</getRefinedTopicCount>
</soap:Body>
</soap:Envelope>
我们将其保存在request_soap.xml文件中放置在类路径com/baobaotao/xfire/server下。当该SOAP请求报文发送给BbtForumService的Web Service后,我们预计它应该返回对应代码清单7所示的正确的SOAP响应报文:
代码清单7 SOAP响应报文
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<getRefinedTopicCountResponse xmlns="http://www.baobaotao.com">
<out>32</out>
</getRefinedTopicCountResponse>
</soap:Body>
</soap:Envelope>
下面,我们着手编写测试BbtForumService Web Service的测试类,以验证实际SOAP响应报文是否和代码清单7中的一样:
代码清单8 TestBbtForumService
package com.baobaotao.xfire.server;
import org.codehaus.xfire.spring.AbstractXFireSpringTest;
import org.jdom.Document;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBbtForumService extends AbstractXFireSpringTest {
protected ApplicationContext createContext() {①创建包含Web Service的Spring容器
return new ClassPathXmlApplicationContext(
new String[]{"applicationContext.xml"});
}
public void testUsingSoapRequest() throws Throwable {
②通过SOAP请求报文访问BbtForumService的Web Service,对返回
SOAP响应报文进行检测
Document response = invokeService("BbtForumService",
"/com/baobaotao/xfire/server/request_soap.xml");
assertNoFault(response);③确认不包含错误
④为命名空间指定一个别名,方便后续XPath表示式的编写
addNamespace("k", "http://www.baobaotao.com");
assertValid("//soap:Body/k:getRefinedTopicCountResponse", response);⑤
assertXPathEquals("//k:getRefinedTopicCountResponse/k:out/text()", "32",response);⑥
printNode(response);⑦打印响应报文,以便肉眼查看
}
}
使用AbstractXFireSpringTest测试Web Service首先要做的第一件事是通过实现createContext()方法构造Spring容器,如①所示。当Spring容器启动时,XFire将自动让容器中的Web Service生效(仅进行测试,不能对外提供服务)。
第二步需要向Web Service发送一个SOAP请求报文以得到一个SOAP响应报文,如②所示。接下来,就是通过AbstractXFireTest提供的检测DOM内容的方法对报文进行正确性验证。由于代码清单7的SOAP报文体中对应的<getRefinedTopicCountResponse>元素及内部元素都位于http://www.baobaotao.com命名空间中,报文体中没有为这个命名空间定义相应的别名,为了在后续断言方法中能够使用简单的方式定义XPath表达式,我们在④处为http://www.baobaotao.com命名空间定义了一个别名。
理解以上测试代码中几个断言方法的关键在于理解XPath表达式语言,XPath语法内容很丰富,不可能在这里逐一讲解,我们在这里介绍一些典型的XPath语法以满足常见的测试需求:
现在回过头来看⑤、⑥两处的断言方法,相信大家就可以很容易地理解断言规则了,⑤处的断言检测SOAP响应报文是否包含某一特定元素,而⑥处的断言则对元素内的值进行检测。我们也可以通过printNode()方法将一个节点打印到控制台上,方便肉眼查看。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者