Как внедрить TestContext с помощью TestRunner и огурца

Я тестирую службы REST, используя Citrus Java DSL. Я хотел бы сохранить данные из ответа для предварительных операций. Согласно документации, для этих целей я должен использовать тестовый контекст Citrus.

Я попытался внедрить TestContext с аннотацией CitrusResource:

@CitrusResource
private TestRunner runner;

@CitrusResource
private TestContext context;


@When("^service sends request to get all orders$")
public void get_Orders() {
    runner.http(action -> action.client(httpClientName)
            .send()
            .get(basePath));   
}

@Then("^Service gets response with preflight id: \"([^\"]*)\"$")
public void verify_Orders(String preflightId) {
        runner.http(action -> action.client(httpClientName)
            .receive()
            .response(HttpStatus.OK)
            .contentType("application/json;charset=UTF-8")
            .extractFromPayload("$[*].styleId", "ids")
            .validate("$[*].styleId", everyItem(not(isEmptyOrNullString())))
            .validate("$[*].styleId", hasItem(preflightId)));

    String ids = context.getVariable("${ids}", String.class);
}

Но получил исключение Null Pointer

1 Scenarios (1 failed)
4 Steps (1 failed, 1 skipped, 2 passed)
0m5.541s

java.lang.NullPointerException

Кроме того, я попытался создать новый TestContext в требуемом методе.

@CitrusResource
private TestRunner runner;

@CitrusResource
private TestContext context;


@When("^service sends request to get all orders$")
public void get_Orders() {
    runner.http(action -> action.client(httpClientName)
            .send()
            .get(basePath));   
}

@Then("^Service gets response with preflight id: \"([^\"]*)\"$")
public void verify_Orders(String preflightId) {
TestContext context = new TestContext();
        runner.http(action -> action.client(httpClientName)
            .receive()
            .response(HttpStatus.OK)
            .contentType("application/json;charset=UTF-8")
            .extractFromPayload("$[*].styleId", "ids")
            .validate("$[*].styleId", everyItem(not(isEmptyOrNullString())))
            .validate("$[*].styleId", hasItem(preflightId)));

    String ids = context.getVariable("${ids}", String.class);
}

И получил

com.consol.citrus.exceptions.CitrusRuntimeException: Unknown variable 'ids'

    at com.consol.citrus.context.TestContext.getVariableObject(TestContext.java:158)
    at com.consol.citrus.context.TestContext.getVariable(TestContext.java:133)
    at com.consol.citrus.context.TestContext.getVariable(TestContext.java:122)

Не могли бы вы помочь мне с этим?


person Kirill Karpov    schedule 25.05.2018    source источник


Ответы (2)


По неизвестной причине аннотация @CitrusResource не вводит экземпляр TestContext в поле. Вы можете использовать обходной путь ниже.

Сначала вам нужно создать и внедрить экземпляр цитрусовых.

@CitrusFramework частный Citrus citrus;

А потом:

testContext = цитрус.создатьTestContext();

person Hoa    schedule 29.08.2018

Я не знаком с Citrus и не знаю, на какую документацию вы ссылаетесь. Чтобы разделить состояние между шагами в Cucumber-jvm, рекомендуется использовать внедрение зависимостей (DI). Существует несколько вариантов внедрения зависимостей с Cucumber, включая Spring, Guice и PicoContainer. Последний представляет собой облегченную структуру DI, которая, вероятно, является лучшим вариантом, если вы не используете другую структуру DI.

person Marit    schedule 25.05.2018