#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, я сделал кое-что, основанное на этой идее, отдельный класс с потребителем и переменной, поэтому выполнение вызывает потребителя со значением переменной