Я пытаюсь следовать примеру из учебника по 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();
}
}
Кажется, проблема в том, что dataTable.raw()
в @Given
step назначает тип неизменяемой коллекции для 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
Может кто-нибудь посоветовать мне, каков стандартный способ обновления DataTable с использованием Java?