我们使用 SoapUI 模拟 Web 服务来测试我们的应用程序(APP),然后才能访问真正的 Web 服务。
创建将返回预定义响应的同步模拟服务很简单。但是,我必须模拟一些异步服务,其中 APP 发送请求,SoapUI 立即响应确认(例如成功),然后在预定义的时间间隔后,SoapUI 将回调我们的应用程序(然后 APP 充当服务器)。我设法使用测试用例来做到这一点,其中第一步是 MockResponse,然后是延迟,然后是 MockRequest(调用我们的应用程序)。
以上工作正常,但我想通过直接在模拟响应中编写脚本来避免使用测试用例。我设法编写了脚本,当模拟服务收到请求时,它将触发回调。
def project = result.mockOperation.mockService.project
// The API documentation doesn't say what finish is supposed to do but I try (doesn't help)
result.finish()
// Request that will be returned back - THE CALLBACK
def request = project.interfaces["LocationServicesOperation"].operations["ackLocation"].getRequestByName("Request 1")
sleep(4000)
request.submit(new com.eviware.soapui.impl.wsdl.WsdlSubmitContext( ), false)
上面的问题是它会在发送初始请求的响应之前触发回调。我尝试在 SoapUI PRO 中使用事件处理,但无法正常工作。在 Wireshark 中,我可以看到这样的通信:
1) APP request -> SoapUI
2) SoapUI callback -> APP
3) APP confirms 2) -> SoapUI
4) SoapUI confirms 1) -> APP
但是它必须是:
1) APP request -> SoapUI
2) SoapUI confirms 1) -> APP
3) SoapUI callback -> APP
4) APP confirms 2) -> SoapUI
上面的代码实际上来自 SoapUI Pro 中的 MockRunListener.onMockResult 事件。
result.finish()
不成功。感谢您的任何提示!
最佳答案
我终于在 http://www.eviware.com/forum/viewtopic.php?f=5&t=3542&p=12474&hilit=asynchronous#p12474 找到了解决方案
诀窍不是直接从响应脚本中分派(dispatch)请求以将回调请求添加到测试,然后调用测试。这将导致模拟运行器首先发送对请求的响应,然后运行测试用例。
优点是测试用例是动态触发的,不需要一直运行。
关于web-services - SoapUI 模拟异步服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7901685/