![](/img/trans.png)
[英]Cucumber-JVM 3 - io.cucumber.datatable.UndefinedDataTableTypeException
[英]Custom datatable transformer for cucumber-jvm
我想在黃瓜中創建自定義數據表變換器。 這是我的功能的樣子:
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;
}
}
}
在舊版本的黃瓜中,根據您所述的1.2.2,您必須請求一個對象列表,因為數據表的每一行(從特征文件的角度來看)被視為不同的對象,例如
@Given("^board$")
public void board(List<Board> board) throws Throwable {
// process however you want
}
很多黃瓜已經從v3開始改變了數據表,例如從XStream切換到Jackson
但如前所述,盡可能升級您的Cucumber版本
如果你可以去
@Given("^board$")
public void board(List<List<String>> board) throws Throwable {
...
你為什么不立即創建你的Board對象
Board board2 = new Board(board);
看起來你不需要變壓器。
假設目標是將“討厭的參數轉換東西”與“實際測試代碼”分開,這樣我就可以在我的測試代碼中使用漂亮的對象,我能夠想到的最好的就是利用Jackson ObjectMapper (或其他支持Map to Object的de / serialization lib)。
例如:
private ObjectMapper objectMapper = new ObjectMapper();
@When("I do some thing with input dataTable")
public void i_do_some_thing_with_input_dataTable(DataTable dataTable) {
List<Map<String,String>> values = dataTable.asMaps(String.class, String.class);
List<MyObject> inputs = values.stream().map(i -> objectMapper.convertValue(i,MyObject.class)).collect(Collectors.toList());
inputs.forEach(i-> {
//Do things with the input.
});
}
您可以/應該將此轉換包裝在一些可以在測試中注入/實例化的優秀服務類中。
此代碼假定以下內容:
MyObject
有字段,其名稱對應於表中的標題 MyObject
為每個字段都有適當的getter / setter。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.