如何使用 TestRunner 和 Cucumber 注入 TestContext
How to inject TestContext using TestRunner and cucumber
我正在使用 Citrus Java DSL 测试 REST 服务。我想保存响应中的数据以进行高级操作。根据文档,我应该为此目的使用 Citrus 测试上下文。
我尝试使用 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)
你能帮我解决一下吗?
我不熟悉 Citrus,也不确定您指的是哪个文档。要在 Cucumber-jvm 中的步骤之间共享状态,建议使用依赖注入 (DI)。 Cucumber 的 DI 有几个选项,包括 Spring、Guice 和 PicoContainer。后者是一个轻量级 DI 框架,如果您不使用其他 DI 框架,这可能是最佳选择。
由于未知原因,注释@CitrusResource 没有将 TestContext 实例注入到字段中。您可以使用下面的解决方法。
首先您需要创建并注入一个柑橘实例。
@CitrusFramework
private Citrus citrus;
然后:
testContext = citrus.createTestContext();
我正在使用 Citrus Java DSL 测试 REST 服务。我想保存响应中的数据以进行高级操作。根据文档,我应该为此目的使用 Citrus 测试上下文。
我尝试使用 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)
你能帮我解决一下吗?
我不熟悉 Citrus,也不确定您指的是哪个文档。要在 Cucumber-jvm 中的步骤之间共享状态,建议使用依赖注入 (DI)。 Cucumber 的 DI 有几个选项,包括 Spring、Guice 和 PicoContainer。后者是一个轻量级 DI 框架,如果您不使用其他 DI 框架,这可能是最佳选择。
由于未知原因,注释@CitrusResource 没有将 TestContext 实例注入到字段中。您可以使用下面的解决方法。
首先您需要创建并注入一个柑橘实例。
@CitrusFramework private Citrus citrus;
然后:
testContext = citrus.createTestContext();