转换黄瓜中的数据表

时间:2020-05-16 06:28:04

标签: java spring testing cucumber bdd

我正在研究Cucumber,以便在春季启动项目中为Java程序编写BDD测试。

将该表想象为用户给定数据的示例:

Given user wants to buy a T-shirt with the following attributes
  | color | size  |
  | blue  | small |
  | black | large |

问题出在映射数据上,我在调用一个API,该API以json格式获取数据,并且知道colour而不是color并以SL的形式获取{ {1}}属性不是sizesmall

有什么方法可以自动转换表中的数据,包括具有更多列和行的表的值或标题吗?

1 个答案:

答案 0 :(得分:0)

在这里,我将分享我的工作方式:

首先创建一个用于映射数据的POJO:

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class TshirtInfo {

    private String colour;

    private String size;

    @Override
    public String toString() {
        return "TshirtInfo [colour: " + colour + ", size: " + size + "]";
    }

}

然后创建一个DataTransformer类以将数据映射到POJO:

public class DataTransformer implements TypeRegistryConfigurer {

    public DataTransformer () {
        this.map = new HashMap<>();
        this.map.put("small", "S");
        this.map.put("large", "L");
    }

    private Map<String, String> map;

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

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

                            String colour = row.get("color");
                            String size = this.map.get(row.get("size"));

                        return new LoginInfo(colour, size);
                        }
                )
        );
    }


}

最后使用它们:

public class Stepdefs implements En {

    public Stepdefs () {

        Given("user wants to buy a T-shirt with the following attributes", (DataTable dataTable) -> {

            System.out.println(dataTable);

            List<TshirtInfo> infos = dataTable.asList(TshirtInfo.class);
            System.out.println(infos);

        .
        .
        .
        .
        // other parts of your code

}

输出如下:

  | color | size  |
  | blue  | small |
  | black | large |

[TshirtInfo [colour: blue, size: S], TshirtInfo [colour: black, size: L]]

仅此而已。