JUnit 使用 JOptionPane.showMessageDialog 测试方法
JUnit testing a method with JOptionPane.showMessageDialog
我做了一个游戏,用户和 AI 轮流 "rolling" 掷骰子。游戏会自动轮到 AI 并 returns 轮到用户。我使用 JOptionPane.showMessageDialog 弹出一个对话框,通知用户轮到他们了。所以所有这些都正常工作,但是当我执行 JUnit 测试 class 来测试 hold() 方法时,弹出窗口出现了。有没有办法在 JUnit 测试 class?
中抑制弹出窗口或自动关闭 window
public void hold() {
this.swapWhoseTurn();
this.setChanged();
this.notifyObservers();
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
HumanPlayerPanel.turnAlert();
}
turnAlert 是另一个名为 HumanPlayerPanel 的 class 中的静态方法。这是代码。
public static void turnAlert() {
JOptionPane.showMessageDialog(null, "It is your turn");
}
我看到我可以在 OK_Option 按钮上调用 doClick 方法,但我不太确定如何找到该按钮。感谢任何帮助。
重构if语句如下:
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
HumanPlayerPanel.turnAlert();
}
看起来像这样:
...
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
alertHumanPlayer();
}
...
protected void alertHumanPlayer(){
HumanPlayerPanel.turnAlert();
}
让我们假设上面 class 被称为游戏。在您的测试代码中,扩展 Game class 如下:
...
public class GameWithNoHumanAlert extends Game{
@Override
protected void alertHumanPlayer(){
// Do not show alert
// HumanPlayerPanel.turnAlert();
}
}
@Test
public void uiTest(){
GameWithNoHumanAlert game = new GameWithNoHumanAlert();
...
// Do your testing normally now.
}
__UPDATE__
另一个,恕我直言,更好的想法是使用 mock testing. I have personally tried several of them and I an suggest you to take a look at Jmockit。用它来处理这种麻烦几乎是微不足道的,这样你就可以专注于你想要/需要测试的东西。
干杯。
我做了一个游戏,用户和 AI 轮流 "rolling" 掷骰子。游戏会自动轮到 AI 并 returns 轮到用户。我使用 JOptionPane.showMessageDialog 弹出一个对话框,通知用户轮到他们了。所以所有这些都正常工作,但是当我执行 JUnit 测试 class 来测试 hold() 方法时,弹出窗口出现了。有没有办法在 JUnit 测试 class?
中抑制弹出窗口或自动关闭 window public void hold() {
this.swapWhoseTurn();
this.setChanged();
this.notifyObservers();
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
HumanPlayerPanel.turnAlert();
}
turnAlert 是另一个名为 HumanPlayerPanel 的 class 中的静态方法。这是代码。
public static void turnAlert() {
JOptionPane.showMessageDialog(null, "It is your turn");
}
我看到我可以在 OK_Option 按钮上调用 doClick 方法,但我不太确定如何找到该按钮。感谢任何帮助。
重构if语句如下:
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
HumanPlayerPanel.turnAlert();
}
看起来像这样:
...
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
alertHumanPlayer();
}
...
protected void alertHumanPlayer(){
HumanPlayerPanel.turnAlert();
}
让我们假设上面 class 被称为游戏。在您的测试代码中,扩展 Game class 如下:
...
public class GameWithNoHumanAlert extends Game{
@Override
protected void alertHumanPlayer(){
// Do not show alert
// HumanPlayerPanel.turnAlert();
}
}
@Test
public void uiTest(){
GameWithNoHumanAlert game = new GameWithNoHumanAlert();
...
// Do your testing normally now.
}
__UPDATE__
另一个,恕我直言,更好的想法是使用 mock testing. I have personally tried several of them and I an suggest you to take a look at Jmockit。用它来处理这种麻烦几乎是微不足道的,这样你就可以专注于你想要/需要测试的东西。
干杯。