gpt4 book ai didi

java - Cucumber Java如何更新DataTable中的元素

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:36 24 4
gpt4 key购买 nike

我正在尝试遵循 Cucumber 教程中的示例,但它是为 Ruby 编写的,我正在尝试用 Java 编写它。我在实现 @When 步骤时遇到困难,因为它要求我更新数据表,并且抛出以下异常,

java.lang.UnsupportedOperationException
at java.base/java.util.Collections$UnmodifiableList.set(Collections.java:1308)
at cucumber_tutorial.expressive_scenarios.chapter5.features.step_definitions.BoardSteps.player_x_plays_in_row_column(BoardSteps.java:36)
at ✽.When player x plays in row 2, column 1(tic_tac_toe.feature:8)

我的功能如下,

Feature:
Scenario:
Given a board like this:
| | 1 | 2 | 3 |
| 1 | | | |
| 2 | | | |
| 3 | | | |
When player x plays in row 2, column 1
Then the board should look like this:
| | 1 | 2 | 3 |
| 1 | | | |
| 2 | x | | |
| 3 | | | |

运行该功能并获取生成的代码片段后,我得到以下内容(我自己也添加了几行),

package cucumber_tutorial.expressive_scenarios.chapter5.features.step_definitions;

import cucumber.api.DataTable;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import java.util.List;

public class BoardSteps {

List<List<String>> boardList;

@Given("^a board like this:$")
public void a_board_like_this(DataTable dataTable) throws Throwable {
boardList = dataTable.raw();
System.out.println(boardList);
// Write code here that turns the phrase above into concrete actions
// For automatic transformation, change DataTable to one of
// List<YourType>, List<List<E>>, List<Map<K,V>> or Map<K,V>.
// E,K,V must be a scalar (String, Integer, Date, enum etc)
//throw new PendingException();
}

@When("^player x plays in row (\\d+), column (\\d+)$")
public void player_x_plays_in_row_column(int row, int col) throws Throwable {
// Write code here that turns the phrase above into concrete actions
//board.
//throw new PendingException()
boardList.get(row).set(col, "x");
}

@Then("^the board should look like this:$")
public void the_board_should_look_like_this(DataTable expectedTable) throws Throwable {
// Write code here that turns the phrase above into concrete actions
// For automatic transformation, change DataTable to one of
// List<YourType>, List<List<E>>, List<Map<K,V>> or Map<K,V>.
// E,K,V must be a scalar (String, Integer, Date, enum etc)
expectedTable.diff(boardList);
//throw new PendingException();
}

}

问题似乎是 @Given 步骤中的 dataTable.raw() 将不可修改的集合类型分配给 boardList ,因此使其不可更新。Ruby 示例仅包含,​ 

row, col = row.to_i, col.to_i​   
@board[row][col] = ​'x'​

我的异常是从抛出的,

boardList.get(row).set(col, "x"); //this line throws the exception

有人可以告诉我使用 Java 更新 DataTable 的标准方法是什么吗?

最佳答案

正如@Grasshopper在上面的评论中建议的那样,我已经实现了一个转换函数 convertDataTableToModifiableList将不可修改的 DataTable 转换为 List<List<String>>我可以更新的对象。我的工作解决方案现在如图所示,

import cucumber.api.DataTable;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

import java.util.ArrayList;
import java.util.List;

public class BoardSteps {

List<List<String>> boardList;

@Given("^a board like this:$")
public void a_board_like_this(DataTable dataTable) throws Throwable {
boardList = convertDataTableToModifiableList(dataTable);
System.out.println(boardList);
// Write code here that turns the phrase above into concrete actions
// For automatic transformation, change DataTable to one of
// List<YourType>, List<List<E>>, List<Map<K,V>> or Map<K,V>.
// E,K,V must be a scalar (String, Integer, Date, enum etc)
//throw new PendingException();
}

@When("^player x plays in row (\\d+), column (\\d+)$")
public void player_x_plays_in_row_column(int row, int col) throws Throwable {
// Write code here that turns the phrase above into concrete actions
//board.
//throw new PendingException()
boardList.get(row).set(col, "x");
}

@Then("^the board should look like this:$")
public void the_board_should_look_like_this(DataTable expectedTable) throws Throwable {
// Write code here that turns the phrase above into concrete actions
// For automatic transformation, change DataTable to one of
// List<YourType>, List<List<E>>, List<Map<K,V>> or Map<K,V>.
// E,K,V must be a scalar (String, Integer, Date, enum etc)
expectedTable.diff(boardList);
//throw new PendingException();
}

private List<List<String>> convertDataTableToModifiableList(DataTable dataTable){
List<List<String>> lists = dataTable.asLists(String.class);
List<List<String>> updateableLists = new ArrayList<>();
for (int i = 0; i < lists.size(); i++){
List<String> list = lists.get(i);
List<String> updateableList = new ArrayList<>();
for (int j = 0; j < list.size(); j++){
updateableList.add(j, list.get(j));
}
updateableLists.add(i, updateableList);
}
return updateableLists;
}

}

我很惊讶没有更优雅的方法来做到这一点,如果您有更好的建议,请告诉我。

关于java - Cucumber Java如何更新DataTable中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54525586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com