在Citrus Framework中以不同的方法重用HTTP消息

时间:2018-11-07 18:36:23

标签: java bdd citrus-framework

问题:如何在Citrus Framework中以两种不同的方法(在同一步骤中)重用同一HTTP消息

版本 Citrus 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中给出超时,因为 Citrus 希望收到第二条消息(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 :(得分:2)

您可以执行以下操作:

@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