Webservice如何通过代码单元测试

前面我在下面这篇文章说过如何使用WebService:
SpringBoot整合Apache-CXF实践

在这篇文章中我列举过通过SOAP UI测试webservice接口。

但实际中涉及服务调用的情况,需要类似单元测试的东西。

一、基于代理类工厂

核心代码很简单,如下所示(这个比较普遍常用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {
// 接口地址(写webservice的地址)
String address = "http://127.0.0.1:9090/cxf/user?wsdl";
// 代理工厂
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 设置代理地址
jaxWsProxyFactoryBean.setAddress(address);
// 设置接口类型
jaxWsProxyFactoryBean.setServiceClass(UserService.class);
// 创建一个代理接口实现
UserService userService = (UserService) jaxWsProxyFactoryBean.create();

return userService.addUser(email, username, password);
} catch (Exception e) {
e.printStackTrace();
return -1;
}

二、动态调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 创建动态客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//接口地址
Client client = dcf.createClient("http://127.0.0.1/cxf/user?wsdl");
// 需要密码的情况需要加上用户名和密码
// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));
Object[] objects = new Object[0];
try {
// invoke("方法名",参数1,参数2,参数3....);
objects = client.invoke("getUserName", "maple");
System.out.println("返回数据:" + objects[0]);
} catch (java.lang.Exception e) {
e.printStackTrace();
}

三、通过Controller调用

我在SpringBoot整合Apache-CXF实践
这篇文章里就写到过。

具体的代码例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.blog.cxf.client.controller;

import com.blog.cxf.server.dto.UserReqDto;
import com.blog.cxf.server.service.UserService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.web.bind.annotation.*;

/**
* @description:
* @author: youcong
* @time: 2020/10/24 23:37
*/
@RestController
@RequestMapping("/user")
public class UserApiController {


@PostMapping("/add")
public int add(@RequestParam String email, @RequestParam String username, @RequestParam String password) {

try {
// 接口地址
String address = "http://127.0.0.1:9090/cxf/user?wsdl";
// 代理工厂
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 设置代理地址
jaxWsProxyFactoryBean.setAddress(address);
// 设置接口类型
jaxWsProxyFactoryBean.setServiceClass(UserService.class);
// 创建一个代理接口实现
UserService userService = (UserService) jaxWsProxyFactoryBean.create();

return userService.addUser(email, username, password);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
}

至于其它服务调用,可以通过Feign,也可以基于HtppClient。

至于上面三种哪种更好,具体看实际业务场景而定。可以根据自己的需求来选择。

最后向大家推荐一下,近来所写关于WebService安全机制的思考和实践一文:
WebService安全机制的思考与实践

文章目录
  1. 一、基于代理类工厂
  2. 二、动态调用
  3. 三、通过Controller调用