如何使用TestRunner和黄瓜注入TestContext

时间:2018-05-25 08:23:14

标签: java cucumber citrus-framework

我正在使用Citrus Java DSL测试REST服务。我想保存响应中的数据以进行预先操作。根据该文件,我应该使用柑橘测试环境来达到这个目的。

我尝试使用CitrusResource注释注入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) {
        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);
}

但得到空指针异常

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)

你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我不熟悉柑橘,我不确定你指的是哪种文件。要在Cucumber-jvm中的步骤之间共享状态,建议使用依赖注入(DI)。 DI与黄瓜有几种选择,包括Spring,Guice和PicoContainer。后者是一个轻量级的DI框架,如果你没有使用不同的DI框架,它可能是最好的选择。

答案 1 :(得分:0)

由于未知原因,注释@CitrusResource不会将TestContext实例注入该字段。您可以在下面使用替代方法。

首先,您需要创建并注入一个柑橘类实例。

  

@CitrusFramework   私人柑橘柑橘;

然后:

  

testContext = citrus.createTestContext();