Повторное использование HTTP-сообщения в различных методах в Citrus Framework - PullRequest
0 голосов
/ 07 ноября 2018

Проблема : Как повторно использовать одно и то же сообщение HTTP двумя разными способами (на одном шаге) в Citrus Framework

Версии : Цитрус 2.8.0-SNAPSHOT ; огурец 3.0.2 ; Java 8

Наличие этого корнишона:

    Scenario: Client has permission to access the action
        Given that client has access to action
        When the client calls the endpoint /some-endpoint/client/1/action/some-action
        Then the client receives status code of 200
        And the client receives a response with {"action" : "some-action", "permission": "AUTHORIZED"}

и следующий фрагмент Java код:

  @Then("the client receives status code of {int}")
  public void the_client_receives_status_code_of(Integer statusCode) {

    designer.http().client(httpClient).receive().response(HttpStatus.valueOf(statusCode))
        .contentType("application/json;charset=UTF-8"):
  }

  @Then("the client receives a response with {string}")
  public void the_client_receives_a_response_with(String payload) {

    designer.http().client(httpClient).receive().response().payload(payload);
  }

Если этот код запускается, в методе the_client_receives_a_response_with будет задано время ожидания, поскольку Цитрус ожидает получения второго сообщения (send метод был вызван только один раз).

Цель здесь состоит в том, чтобы отделить проверки кода HTTP от полезной нагрузки, поэтому разделение было выполнено путем создания двух методов. Как повторно использовать сообщение, полученное в методе the_client_receives_status_code_of?

Уже безуспешно пробовал следующее:

Предоставление имени полученному сообщению:

designer.http().client(httpClient).receive().response(HttpStatus.valueOf(statusCode)).name("currentMessage")
        .contentType("application/json;charset=UTF-8");

Но пытаюсь получить доступ к сообщению так:

@CitrusResource
private TestContext testContext;
...
testContext.getMessageStore().getMessage("currentMessage");

Возвращает null.

Но используя это:

designer.echo("citrus:message(currentMessage)");

Печатает правильное сообщение.

Итак, как я могу получить доступ к сообщению в коде Java, т.е. иметь доступ к сообщению, чтобы сделать что-то вроде этого:

Assert.assertTrue(testContext.getMessageStore().getMessage("currentMessage").getPayload().equals(payload));

В двух разных методах.

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете сделать что-то вроде этого:

@Then("the client receives a response with {string}")
public void the_client_receives_a_response_with(String payload) {
    designer.action(new AbstractTestAction() {
        public void doExecute(TestContext context) {
            Assert.assertTrue(context.getMessageStore()
                                         .getMessage("currentMessage")
                                         .getPayload(String.class)
                                         .equals(payload));
        }
    });
}

Абстрактное действие всегда предоставляется с текущим экземпляром TestContext вашего текущего теста. Таким образом, инъекция @CitrusResource здесь не работает, поскольку вы получаете другой экземпляр, в котором именованное сообщение неизвестно.

Также в качестве альтернативы вы можете выполнить шаги BDD API по умолчанию для именованных сообщений, которые описаны здесь: https://citrusframework.org/citrus/reference/html/index.html#named-messages

Может быть, BDD API создателя сообщений также поможет: https://citrusframework.org/citrus/reference/html/index.html#message-creator-steps

...