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

#java #integration-testing #citrus-framework

#java #интеграция-тестирование #citrus-framework

Вопрос:

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

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

 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));
}
  

Ответ №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, чтобы прочитать переменную как длинное значение.

Комментарии:

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