我在一个 TableService 类和一个函数中有以下变量,该函数接受列表上的currentPlayer索引,加上+1,并使currentPlayer成为具有此递增索引的那个。currentPlayer 在前面的不同方法中被赋值为currentPlayer = Optional.of(players.get(0));
。
private ArrayList<Player> players = new ArrayList<>();
private Optional<Player> currentPlayer = Optional.empty();
public void setNextPlayerCurrent() {
int currentPlayerIndex = players.indexOf(currentPlayer.get());
if (!lastPlayerCheck(currentPlayerIndex)) {
currentPlayer = Optional.of(players.get(currentPlayerIndex + 1));
}
else {
currentPlayer = Optional.of(players.get(0));
}
}
我想测试一下,我写了下面的函数:
@Test
void checkCurrentPlayerSetting() {
List<Player> players = tableService.getPlayers();
Optional<Player> currentPlayer = tableService.getCurrentPlayer();
Player player1 = new Player("A", "Adam", 100);
Player player2 = new Player("B", "Bella", 100);
players.add(player1);
players.add(player2);
currentPlayer = Optional.of(players.get(0));
int player1Index = players.indexOf(player1);
int player2Index = players.indexOf(player2);
System.out.println(player1Index); // prints 0
System.out.println(player2Index); / prints 1
System.out.println(players.indexOf(currentPlayer.get())); // prints 0
tableService.setNextPlayerCurrent(); // java.util.NoSuchElementException: No value present!!!
//assertEquals(player2.getId(), currentPlayer.get().getId());
}
我想Assert在执行 *setNextPlayerCurrent()之后 * player2将匹配currentPlayer。我应该如何处理这个异常?
也在TableService类中编辑:lastPlayerCheck():
public boolean lastPlayerCheck(int currentPlayerIndex) {
if (currentPlayerIndex == (players.size() - 1)) {
return true;
}
return false;
}
1条答案
按热度按时间noj0wjuj1#
据我所知,
TableService
中的currentPlayer
字段除了用Optional.empty()
初始化之外,从未被赋予过其他值。因此,您的TableService
可能需要一个类似setCurrentPlayer(Player player)
的方法,以便您可以手动配置currentPlayer
字段。注意:您尝试在测试中为currentPlayer
字段赋值的方法不起作用!也许你的下一个想法是做这样的事情:
但是Java Optionals是IMMUTABLE的,这意味着你不能给一个Optional Object赋值,而是必须创建一个新的
Optional
对象,并将其赋值给这个对象,这就是为什么Optional
类中没有setValue()
这样的方法。**更新:**我认为您还没有完全理解method parameters的工作原理。您基本上要做的是:
当您将变量作为参数传递给方法时,您不能在该方法的上下文中重新分配该变量,因此方法外的变量(从调用此方法的位置)也被重新赋值!实际上,
updateString(String: someString)
方法中的someString
参数与外部作用域中的someString
变量是不同的变量(从调用方法的地方),但只保存对相同值的引用(在本例中为“更新的字符串值”)。因此,当您在内部方法中重新分配该变量时,并不是在更新已传递到方法中的变量(在外部作用域中)!