问题描述
我想注册我的自定义类型,以便自动从数据表中获取列表。
尽管有很多来源引用了 TypeRegistryConfigurer 类,但这似乎在最新的 Cucumber 核心版本中已被弃用。
我试图查看 this source 所以我这样做了:
public class BurpStepDefs implements En {
private static ObjectMapper objectMapper = new ObjectMapper();
private static final DataTableType ENTRY =
new DataTableType(CartInput.Article.class,(java.util.Map<String,String> entry) ->
objectMapper.convertValue(entry,CartInput.Article.class));
private final DataTableTypeRegistry registry = new DataTableTypeRegistry(Locale.ENGLISH);
public BurpStepDefs() {
registry.defineDataTableType(ENTRY);
Given("burped",() -> {
});
When("burping",(DataTable o) -> {
o.asList(CartInput.Article.class); // goes wrong
});
Then("burp",(DataTable o) -> {
});
}
}
这是特征文件
Feature: operate with customer cart
Verify all cart operations
Scenario: scenario burp
Given burped
When burping
| BIRP | 1 |
| BYRP | 1 |
Then I burp
| BIRP | 1 |
| BYRP | 1 |
我收到以下错误:
Can't convert DataTable to List<it.infocert.ecommerce.checkout.model.CartInput$Article>.
Please review these problems:
- There was no table entry or table row transformer registered for it.infocert.ecommerce.checkout.model.CartInput$Article.
Please consider registering a table entry or row transformer.
- There was no default table entry transformer registered to transform it.infocert.ecommerce.checkout.model.CartInput$Article.
Please consider registering a default table entry transformer.
Note: Usually solving one is enough
有什么提示吗?
编辑
阅读@M.P. Korstanje 和 cucumber specs(起初我认为文档已被弃用)我解决了这个问题:
DataTableType((java.util.List<String> entry) -> {
final var output = new CartInput.Article();
output.setName(entry.get(0));
output.setQuantity(Integer.parseInt(entry.get(1)));
output.setOperationId("A");
return output;
});
解决方法
您正在使用来自 Cucumbers 内部 API 的点点滴滴。但是,整个 Cucumbers lambda DSL 都包含在 En
接口(及其父接口 LambdaGlue
)中。因此,要定义单个数据表条目转换器,您将执行以下操作:
public class BurpStepDefs implements En {
private static ObjectMapper objectMapper = new ObjectMapper();
public BurpStepDefs()
DataTableType(
(Map<String,String> entry) -> objectMapper.convertValue(entry,CartInput.Article.class));
}
}
如果您使用的是现代 IDE,您还可以在构造函数中输入 this.
并触发自动完成(ctrl+space)查看可用的建议。