datatable - 在 Java 中的 Cucumber 步骤中为字段定义 Datatable 单元格中的字符串列表

标签 datatable cucumber cucumber-java transformer-model

我想要什么

我正在使用 Cucumber 中的数据表。

我有以下情况:

特征文件中的步骤:

I set the ingredients necessary for a meal
  | name           | ingredients        |
  | mac and cheese | pasta,cheese       |
  | hamburger      | bread,meat,lettuce | 

在我的 StepDefinition 文件中

@When("I set the ingredients necessary for a meal")
public void setIngredients(List<Meal> meals){
  //do things with it
}

我有类(class)餐

public class Meal {
  String name;
  List<String> ingredients;
}

这行不通。

我所知道的

如果我将我的配料字段设置为一个简单的字符串 cucumber ,“神奇地”将名称和配料与类的字段匹配,并且在步骤定义中我将得到一个正确填写的膳食列表。 但目前它不会自动匹配。

我尝试过的

我尝试将类定义为:

public class Meal {
  String name;
  String ingredients;
  List<String> ingredientsList;
}
  • 还有一个构造函数 Meal(String, String) 可以将配料解析到配料列表中,但它不起作用。

  • 我尝试为成分定义一个 setter 来解析它并定义 ingredientsList,但它也不起作用。

  • 我尝试在步骤定义中使用数据表,但我仍然找不到将其转换为我的成分列表的方法。

  • 我尝试使用 Transformer,但是,据我所知,我必须为我想要提供的每顿饭定义一个步骤,并且我必须在步骤本身内发送值。

我不想要的

我不想被迫在 Meal 类以外的任何地方解析信息。

我是怎么临时解决的

在更完整的 Meal 定义中,定义了一个 setIngredientsList() 将成分解析为列表。

在步骤定义中,我遍历了餐食列表并为每餐调用了 setIngredientsList。正如我所说,我不希望在 Meal 类之外完成任何此类处理。

问题

有人知道我该怎么做吗?

最佳答案

我会考虑使用 Map<String, String>而不是列表。查看您的示例对我来说就像名称值对。 map 可能很合适。

当您的字段在 Meal 中被封装为私有(private)时您可能不需要构造函数。但是,我会将它们隐藏为私有(private)变量并添加一个双参数构造函数。尽可能少暴露的习惯有助于长期维护。

我写了一个blog post不久前可能会对您有所帮助。

关于datatable - 在 Java 中的 Cucumber 步骤中为字段定义 Datatable 单元格中的字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48348027/

相关文章:

c# - 在整个 session 中维护数据表和变量

c# - 图像作为 GridView 中每列的标题

cucumber / capybara 从特定类别中选择按钮?

java - 从 Cucumber Java 中的 Scenario outline 示例表中解析整数列表

eclipse - Cucumber .feature 文件未链接到 Eclipse 中的 stepDefinition.java

java - 如何检测 cucumber-jvm junit 项目中未使用的步骤定义?

c# - 如何在 DateTime WEB 类型的 DataTable 列中仅设置日期

jsf - 在 Prime faces 数据表中延迟加载时,如何在分页后保留选择列表和复选框?

cucumber - 回调重定向不保留 session

testing - extentreports-testng-适配器 : How to generate HTML report with screenshot if test failed (cucumber, testng)