在Java中将WireMock与SOAP Web服务一起使用
问题内容:
到目前为止,我一直在使用通过SOAPUI进行模拟响应。我的用例很简单:
只需将SOAP XML请求发送到不同的端点(http:// localhost:9001 /
endpoint1
),然后返回固定的XML响应。但是MockWrire必须作为独立服务部署到专用服务器上,该服务器将充当从中提供模拟响应的中心位置。
只是想要一些开始的建议。如我所见,WireMock更适合REST Web服务。所以我的疑问是:
1)我是否需要将其部署到Java Web服务器或容器以充当始终运行的独立服务。我读到你可以通过使用
java -jar mockwire.jar --port [port_number]
2)我需要使用MockWire API吗?我需要为用例创建类吗?就我而言,请求将通过JUnit测试用例触发以进行模拟。
3)如何实现简单的URL模式匹配?如上所述,我只需要简单的模拟即可,即在对http:// localhost:9001 /
endpoint1
进行请求时获得响应
4)我的用例是否有更好/更容易的框架?我读过有关Mockable的文章,但它对3个团队成员和免费试用版域有限制。
问题答案:
我是WireMock的创造者。
我最近使用WireMock在客户端项目上模拟了SOAP接口的集合,因此我可以证明这是可能的。至于它比SOAP
UI更好还是更坏,我想说它有一定的优势,但需要权衡取舍。主要优点是相对易于部署和编程访问/配置,并支持HTTPS和低级故障注入之类的功能。但是,您需要做更多的工作来解析和生成SOAP负载-
它不会像SOAP UI一样从WSDL中生成代码/存根。
我的经验是,诸如SOAP UI之类的工具可以使您入门更快,但是从长远来看,当您的测试套件变得微不足道时,往往会导致更高的维护成本。
依次解决您的问题:1)如果要让模拟在服务器上的某个地方运行,执行此操作的最简单方法是运行如上所述的独立JAR。我建议不要尝试将其部署到容器中-
此选项仅在没有其他选择时才存在。
但是,如果您只想运行集成测试或完全独立的功能测试,建议您使用JUnit规则。我要说的是,如果a)您正在将其他已部署的系统插入其中,或者b)您是通过非JVM语言使用它,那么在专用的过程中运行它只是一个好主意。
2)您需要使用以下三种方式之一进行配置:1)Java API,2)HTTP上的JSON或3)JSON文件。3)可能与您使用SOAP UI所使用的最接近。
3)有关使用JSON和Java的大量存根示例,请参见http://wiremock.org/stubbing.html。由于SOAP倾向于绑定到固定端点URL,因此您可能需要urlEqualTo(...)
。当我过去对SOAP进行存根时,我倾向于对整个请求正文进行XML匹配(请参阅http://wiremock.org/stubbing.html#xml-
body-matching)。我建议投资编写一些Java构建器以发出所需的请求和响应主体XML。
4)Mock Server和Betamax都是WireMock的成熟替代品,但AFAIK不再提供更明确的SOAP支持。