簡體   English   中英

黃瓜-jvm的自定義數據表變換器

[英]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而不是TableCellTransformerTableEntryTransformerTableRowTransformer

您可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM