Как передать переменную, извлеченную из полезной нагрузки, в цитрусовой среде?

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

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

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

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

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

Но это Long, поэтому приведение не работает (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));
}

person Pedro R.    schedule 19.10.2016    source источник


Ответы (1)


Лучший способ получить доступ к объектам тестовых переменных в 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, чтобы прочитать переменную как длинное значение.

person Christoph Deppisch    schedule 20.10.2016
comment
Спасибо @christoph, я сделал что-то на основе этой идеи, отдельный класс с потребителем и переменной, поэтому выполнение вызывает потребителя со значением переменной - person Pedro R.; 20.10.2016