web-dev-qa-db-ja.com

Cucumber DataTableからMapへの変換

キュウリデータテーブルを使用しています。このデータテーブルをリストではなくマップに変換したい。したがって、基本的には、ヘッダー行をキーとして使用し、データ行をキーの値として使用するとどうなりますか。どうすればいいですか?

より明確にするために1つの例を共有しましょう。

以下の動物を考えると:

_  | Type  | BabyAnimal |    
  | cow   | Calf       |
  | horse | Pony       |
  | sheep | Lamb       |
_

ここで_List<List<String>>_を作成する代わりに、ここで_List<Map<String,String>>_を使用することをお勧めします。マップのキーには「Type」と「BabyAnimal」が含まれ、値にはそれぞれの値が含まれている必要があります。したがって、マップエンティティは次のようになります。

_<Type,cow>,<BabyAnimal,Calf>
<Type,horse>,<BabyAnimal,Pony>
<Type,sheep>,<BabyAnimal,Lamb>
_

どうすればよいでしょうか?キーからデータをフェッチしているので、これはより良いアプローチだと思います。例List(1).Map.get(Type) Listの場合、get(0)、get(1)を実行する必要があり、不正なデータを使用する可能性があります。

5
Neha

Maritの回答で述べたように、v3 plusを使用している場合は、もう少し作業する必要があります。マップのリストを取得する代わりに、マップのリストを含むカスタムオブジェクトを取得できます。

これを参照して、すべてのデータテーブル変換について言及する構成クラスについて理解します- Cucumber-JVM-io.cucumber.datatable.UndefinedDataTableTypeException

このコードをこのクラスに配置します。

registry.defineDataTableType(new DataTableType(Animals.class, new TableTransformer<Animals>() {
            @Override
            public Animals transform(DataTable table) throws Throwable {
                Animals animals = new Animals();
                table.asMaps().forEach(e -> animals.addAnimal(e));
                return animals;
            }
        }));

これはコンテナまたはデータオブジェクトクラスです。

public class Animals {

    public static final String type = "type";   
    public static final String baby = "babyanimal";

    private List<Map<String, String>> details = new ArrayList<>();

    public void addAnimal(Map<String, String> entry) {
        details.add(entry);
    }

    public List<Map<String, String>> getDetails() {
        return details;
    }

    @Override
    public String toString() {
        return "Animals [details=" + details + "]";
    }
}

ステップ定義

@Given("all baby animal details")
public void allMapDetails(Animals anim) {
    System.out.println(anim.getDetails());
}

あなたはこのようなものを手に入れるべきです-

[{type = horse、babyanimal = Pony}、{type = sheep、babyanimal = Lamb}、{type = cow、babyanimal = Calf}]

2
Grasshopper

そして、質問のジェネリック型がhtmlによって変更されたため、2番目の回答を追加します。

以下の動物を考えると:

| Type  | BabyAnimal |    
| cow   | Calf       |
| horse | Pony       |
| sheep | Lamb       |

これをステップ定義にしたい場合:

@Given("all baby animal details")
public void allMapDetails(List<Map<String, String>> animals) {
    System.out.println(animals);
}

次に、テーブルは自動的に文字列から文字列へのマップのリストに変換されます。

2
mpkorstanje

以下の動物を考えると:

| Type  | BabyAnimal |    
| cow   | Calf       |
| horse | Pony       |
| sheep | Lamb       |

そして、これをステップ定義にしたい場合:

@Given("all baby animal details")
public void allMapDetails(Map<Type,BabyAnimal> animals) {
    System.out.println(animals);
}

これらのパラメータータイプを定義する場合:

public class ParameterTypes implements TypeRegistryConfigurer {

    @Override
    public Locale locale() {
        return ENGLISH;
    }

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {
        typeRegistry.defineDataTableType(new DataTableType(
            Type.class,
            (Map<String, String> row) -> new Type(row.get("Type"))
        ));

        typeRegistry.defineDataTableType(new DataTableType(
            BabyAnimal.class,
            (Map<String, String> row) -> new BabyAnimal(row.get("BabyAnimal"))
        ));
    }
}

次に、テーブルは動物の種類から赤ちゃんへのマップに変換されます。

1
M.P. Korstanje

次のDataTableヒントは、GitHubの cucumber-jvmプロジェクト にあります。

        "    // For automatic transformation, change DataTable to one of\n" +
        "    // E, List<E>, List<List<E>>, List<Map<K,V>>, Map<K,V> or\n" +
        "    // Map<K, List<V>>. E,K,V must be a String, Integer, Float,\n" +
        "    // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" +
        "    //\n" +
        "    // For other transformations you can register a DataTableType.\n";

Cucumberのドキュメント で方法を見つけることができます。

リストをステップ定義に渡す最も簡単な方法は、データテーブルを使用することです。

Given the following animals:
  | cow   |
  | horse |
  | sheep |

引数をリストとして宣言しますが、式ではキャプチャグループを定義しないでください。

@Given("the following animals:")
public void the_following_animals(List<String> animals) {
}

あなたの場合、ListMapに置き換えてください。

1
Marit

Cucumber 3.0.2では、DataTableからasMaps()を呼び出すだけです。

public void feature_step(DataTable dataTable) {
    List<Map<String, String>> data =  dataTable.asMaps();
    String type = data.get(0).get("Type");
    Strig babyAnimal = data.get(0).get("BabyAnimal");
}
1
Tristan Zhou