我想在 cucumber 中创建自定义数据表转换器。这是我的功能的样子:
Given board
| o | _ | _ |
| o | _ | _ |
| o | _ | _ |
我想把它放到自定义对象中。假设它看起来像这样:
class Board {
private List<List<String>> board;
public Board(List<List<String>> board) {
this.board = board;
}
}
我的步骤定义应该是这样的:
@Given("^board$")
public void board(Board board) throws Throwable {
// todo
}
步骤定义适用于 DataTable
类和 List<List<String>>
@Given("^board$")
public void board(DataTable board) throws Throwable {
// this works fine
}
这也很好用
@Given("^board$")
public void board(List<List<String>> board) throws Throwable {
// this also works fine
}
我试图在互联网上找到解决方案,但没有成功。我还尝试创建 Transformer
但是,正如我所见,它仅适用于字符串(我想在输入中使用 Datatable 或 List>):
class BoardTransformer extends Transformer<Board> {
@Override
public Board transform(String value) {
// TODO Auto-generated method stub
return null;
}
}
最佳答案
在 Cucumber 3.x 中,您可以使用 TypeRegistryConfigurer
通知 Cucumber 如何从 DataTable
创建 Board
对象。因为您想将整个表转换为单个对象,所以您必须使用 TableTransformer
而不是 TableCellTransformer
、TableEntryTransformer
或 TableRowTransformer
.
您可以将 TypeRegistryConfigurer
放在粘合路径的任何位置。
package io.cucumber.java.test;
import io.cucumber.core.api.TypeRegistryConfigurer;
import io.cucumber.core.api.TypeRegistry;
import io.cucumber.datatable.DataTableType;
import io.cucumber.datatable.TableTransformer;
import java.util.List;
import java.util.Locale;
import static java.util.Locale.ENGLISH;
public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
@Override
public Locale locale() {
return ENGLISH;
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
typeRegistry.defineDataTableType(new DataTableType(
Board.class,
(TableTransformer<Board>) table -> new Board(table.cells())));
}
static class Board {
private final List<List<String>> board;
private Board(List<List<String>> board) {
this.board = board;
}
}
}
关于java - 用于 cucumber-jvm 的自定义数据表转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28338999/