2016-10-19 3 views
0

Я создаю ИТ-тесты с помощью Citrus Framework. У меня есть два вызова на сервер, один для создания пользователя и другой для выполнения некоторой операции с этим пользователем.Как отличить переменную, извлеченную из полезной нагрузки в рамках цитрусовых?

Проблема: Мне нужно значение из запроса на создание, который не является Строкой, чтобы поместить его в запрос второго вызова. Извлечение значения:

new SoapActionBuilder() 
     .client(webServiceClient) 
     .receive() 
     .namespace("ns", MY_NAMESPACE) 
     .extractFromPayload("//ns:someId", "someId") 

А потом этот someId должен быть использован для создания следующего запроса. Если бы это была строка это будет:

request.setSomeId("${someId}"); 

Но это длинная, так что делать отливку не работает (Citrus решает, что значение в дальнейшем, и Long # valueOf выполняется в тот самый момент):

request.setSomeId(Long.valueOf("${someId}")); 

есть ли способ легко бросить эту переменную (возможно по добыче)?

Мне удается сделать это с помощью JavaAction, но очень странно использовать его регулярно (необходимы 3 строки и новый метод). Это что-то вроде:

public void test() { 
    ... 
    action(new JavaActionBuilder(new JavaAction().setInstance(this)) 
      .method("setSomeId") 
      .methodArgs(request, "${someId}")); 

    ... 
} 
public void setSomeId(Request request, String someId) { 
    request.setSomeId(Long.valueOf(someId)); 
} 

ответ

0

Лучшего способа доступа к объектам переменных испытаний в TestDesigner должен сделать это в тестовом действии. Дизайнер тестов Citrus имеет время разработки, где построен полный тестовый пример. Позже во время выполнения тест выполняется, и ваше выражение XPath оценивается тестовой переменной. Таким образом, вы можете добавить новый тест действие, как это:

action(new AbstractTestAction() { 
    @Override 
    public void doExecute(TestContext context) { 
     Long someId = Long.valueOf(context.getVariable("someId")); 
     // do something with someId 
    } 
} 

В отличие от этого, вы можете использовать Citrus TestRunner, который не имеет отдельного времени проектирования. Однако вы должны получить доступ к Citrus TestContext, чтобы прочитать переменную как длинную.

+0

Спасибо @christoph, я сделал что-то на основе этой идеи, отдельный класс с потребителем и переменной, поэтому выполнение вызывает у потребителя значение переменной –