Да, я написала такой простенький пример
Суть такая:
1. По втянутому в проект интерфейсу WSDLа создаём мок (правой кнопкой на интерфейсе, Generate MockService). В поле Path указываем URL, который хотим использовать для мока. Например, вводим /CurrencyConvertorMock, также указываем порт, на котором будет мок крутиться, например 8088. Таким образом, мы ожидаем, что наш веб-сервис будет посылать реквест на адрес http://localhost:8088/CurrencyConvertorMock (вместо локалхост может быть айпишник твоей машины - в общем, зависит от того, как нужно будет настраивать URL, куда будет отправляться второй реквест). После того, как мок создан, желательно открыть его Options и в поле host прописать localhost. (иначе, там будет имя твоей машины, и тест будет работать только с твоей машины)
Мок создан - ура
2. Редактируем Response мока (что мы хотим, чтобы мок отвечал, в твоём случае - пример Confirmation 2)
3. Далее можно написать OnRequest Script - код, который будет выполняться, как только на мок что-то пришло. Пример кода:
def project = mockRunner.getMockService().getProject()
project.properties['r_mockResult'].value = mockRequest.requestContent
log.info 'MockRequest: ' + mockRequest.requestContent
//Example how to save parameter which came to mock
def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent )
project.properties['r_fromCurrency'].value = holder["//*:FromCurrency"]
(тут мы записываем в переменные проекта весь контент реквеста и значение конкретного элемента. Переменные можно очищать пере записью от предыдущих рез-тов, но у меня они очищаются в начале теста. Также прямо здесь можно добавить ассершены всевозможные для валидации того, что пришло на мок, но у меня это вынесено в отдельный степ - так красивее)
Вообще, на моке можно много всякого кода писать. Можно с помощью груви скрипта прописывать динамические респонсы (например, у тебя респонс зависит от того, что пришло в реквесте). Также можно что-то интересное прописать в AfterRequestScript. Например, можно прописать, что после реквеста, мок сам отправляет какой-то реквест куда-то. Пример кода:
def request = project.getInterfaceByName("AnotherInterfaceInProject").getOperationByName("PublishRequest").getRequestByName("Request 1")
request.submit( new com.eviware.soapui.impl.wsdl.WsdlSubmitContext( request ), false )
4. Мок создан и все необходимые скрипты на нём написаны. Переходим в степам непосредственно тест кейса.
Сначала стартуем мок, с помощью Groovy скрипта:
def project = context.testCase.getTestSuite().getProject();
def mockService = project.getMockServiceByName("CurrencyConvertorMock");
mockService.start();
5. Ставим небольшой Delay, чтоб мок нормально успел стартовать
6. Паблишим реквест на наш асинхронный веб-сервис
(у меня в тесте я паблишу реквест прямо на мок сразу, но это сути не меняет - ты можешь запаблишить на какой-то другой сервис, а он уже будет прописан так, чтобы посылать потом реквест на твой мок).
7. Delay - мок работает, ждём
8. Стопаем мок:
def project = context.testCase.getTestSuite().getProject();
def mockService = project.getMockServiceByName("CurrencyConvertorMock");
def mockRunner = mockService.getMockRunner();
mockRunner.stop();
9. Далее я предлагаю сделать groovy script степ, в котором провалидировать данные, кот. пришли на мок:
//Get request which came to mock
def r_mockResult = context.expand( '${#Project#r_mockResult}' )
//now you may perform any assertions with it
//Example of assertion
def r_fromCurrency = context.expand( '${#Project#r_fromCurrency}' )
assert r_fromCurrency == 'USD', 'Currency is incorrect'