web-dev-qa-db-ja.com

Cucumber DataTableを作成するにはどうすればよいですか?

(Gherkinの代わりに)Javaを使用してCucumber DataTableを手動で設定したい。

ガーキンでは、私のテーブルは次のようになります。

| h1 | h2 |
| v1 | v2 |

私のJavaこれまでのところ、このように見えます:

List<String> raw = Arrays.asList( "v1", "v2");
DataTable dataTable = DataTable.create(raw, Locale.getDefault(), "h1", "h2");

返されるのは、ヘッダーはあるが内容はないDataTableです。また、予想よりも長いです:

  | h1| h2 |
  |   |    |
  |   |    |

解決策はかなり単純でなければならないはずですが、今は少し途方に暮れています。テーブルを取得するにはどうすればよいですか?

10
Christian

お役に立てれば。ガーキンスの手順が完全であれば、次のようになります...

When I see the following cooked I should say:
  | food  | say     |
  | Bacon | Yum!    |
  | Peas  | Really? |

これはJavaで必要です。 (渡された cucumber.api.DataTable は、テスト前の期待値で設定されていることに注意してください)。

@When("^I see the following cooked I should say:$")
public void theFoodResponse(DataTable expectedCucumberTable) {
    // Normally you'd put this in a database or JSON
    List<Cuke> actualCukes = new ArrayList();
    actualCukes.add(new Cuke("Bacon", "Yum!"));
    actualCukes.add(new Cuke("Peas", "Really?")); 

    Another link to a Full Example.diff(actualCukes)
}

AslakHellesøyの例では、彼は実際にはDataTableを使用していません。

彼はあなたの例を次のようにします:

@When("^I see the following cooked I should say:$")
public void theFoodResponse(List<Entry> entries) {
    for (Entry entry : entries) {
        // Test actual app you've written
        hungryHuman.setInputValue(entry.food);
        hungryHuman.setOutputValue(entry.say);
    }
}

public class Entry {
    String food;
    String say;
}

もっと読むための完全な例については、チェックアウト:

  • ガーキンス計算機: リンク
  • Java電卓のステップ定義: link

編集:

@Christianのやりすぎで申し訳ありませんが、アプリでそれを使用する方法のコンテキスト全体がおそらく必要ではなく、DataTable.createを使用するクリーンな方法とほとんどのこと私が投稿したのは、Entryクラスを使用してその猫のスキンを作成する別の方法です(後でこれを読む人に役立つかもしれません)。

つまり、コメントでのやり方はそれほど遠くありませんでした。私はコレクションのプロではないので、文字列の2Dリストを作成するためのヒントを提供することはできませんが、最後の2つのパラメーター(4つすべてを使用している場合)を明確にすることができます。

  • 列で日付フィールドまたはカレンダーフィールドを使用している場合、second to lastパラメーターで Format を指定できます。
  • 列名に最後のものを使用しない場合、列名の一番上の行の文字列が自動的に読み取られます。
  • また、Locale.getDefault()をドロップすることもできます。それであなたは見ています:

List<List<String>> infoInTheRaw = Arrays.asList( Arrays.asList("h1", "h2"),
    Arrays.asList("v1", "v2") ); 
DataTable dataTable = DataTable.create(infoInTheRaw);

同様に面倒なコンストラクタを使用することもできます。 :)

11
Eric D. Johnson

DataTableの代わりに、データテーブルと同じフィールドを使用してカスタムオブジェクトのリストを実際に作成できます。

例えば.

Then the book list response should contain records as
      | book_id | book_title  | book_cost | 
      | B0001   | Head First Java  | 350|
      | B002    | Head First Spring| 550|

これで、StepクラスはStepを次のように定義する必要があります

 @Then("^the book list response should contain records as$")
   public void validateBookRecords(List<Book> booksList) throws Throwable { //assertions will go here}

そして、Bookクラスは次のようになります。

    public class Book {
      public String book_id;
      public String book_title;
      public String book_cost;
   }

フィールドはすべてパブリックなので、ゲッター/セッターは必要ありません。それらを非公開と宣言することにした場合(理由は表示されません)、ゲッター/セッターも追加してください。

お役に立てれば

4
Sanjay Bharwani