bugfix> java > 投稿

Citrus Java DSLを使用してRESTサービスをテストしています。事前操作の応答からデータを保存したいと思います。文書によると、この目的には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)

手伝ってくれませんか?

回答 2 件
  • 理由は不明ですが、アノテーション@CitrusResourceはTestContextインスタンスをフィールドに挿入しません。以下の回避策を使用できます。

    最初に、柑橘類のインスタンスを作成して注入する必要があります。

    @CitrusFramework private Citrus citrus;

    その後:

    testContext = citrus.createTestContext();

  • 私はCitrusに精通しておらず、どのドキュメントを参照しているかわかりません。 Cucumber-jvmのステップ間で状態を共有するには、Dependency Injection(DI)を使用することをお勧めします。 Spring、Guice、PicoContainerなど、Cucumberを使用したDIにはいくつかのオプションがあります。後者は軽量のDIフレームワークです。別のDIフレームワークを使用していない場合は、おそらく最適なオプションです。

あなたの答え