Java JUnit使用JOptionPane.showMessageDialog测试方法
我做了一个游戏,用户和AI轮流“掷”骰子。游戏会自动轮到AI并返回到用户的轮到。我使用JOptionPane.showMessageDialog弹出一个对话框,通知用户轮到他们了。所有这些都正常工作,但是当我执行JUnit测试类来测试hold()方法时,弹出窗口出现了。有没有办法在JUnit测试类中抑制弹出窗口或自动关闭窗口Java JUnit使用JOptionPane.showMessageDialog测试方法,java,joptionpane,Java,Joptionpane,我做了一个游戏,用户和AI轮流“掷”骰子。游戏会自动轮到AI并返回到用户的轮到。我使用JOptionPane.showMessageDialog弹出一个对话框,通知用户轮到他们了。所有这些都正常工作,但是当我执行JUnit测试类来测试hold()方法时,弹出窗口出现了。有没有办法在JUnit测试类中抑制弹出窗口或自动关闭窗口 public void hold() { this.swapWhoseTurn(); this.setChanged();
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的类中的静态方法。这是代码
public static void turnAlert() {
JOptionPane.showMessageDialog(null, "It is your turn");
}
我看到我可以在OK_选项按钮上调用doClick方法,但我不太确定如何找到该按钮。非常感谢您的帮助。重构if语句,如下所示:
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
HumanPlayerPanel.turnAlert();
}
...
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.
}
看起来像这样:
...
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
alertHumanPlayer();
}
...
protected void alertHumanPlayer(){
HumanPlayerPanel.turnAlert();
}
让我们假设上面的类叫做Game。在测试代码中,按如下方式扩展游戏类:
if (this.getCurrentPlayer().getIsMyTurn() == this.getComputerPlayer().getIsMyTurn()) {
this.theComputer.takeTurn();
this.hold();
HumanPlayerPanel.turnAlert();
}
...
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.
}
更新
另一个更好的想法是使用。我亲自尝试了其中的几个,我建议你看看。用它来处理此类问题几乎是微不足道的,这样您就可以专注于您想要/需要测试的内容
干杯。我对JUnit没有太多经验,但据了解,它不太适合UI测试。您需要使用一个框架,该框架可以在UI线程(事件调度线程)的范围内与UI交互,并且可以与各种组件(例如按钮)交互但是我不明白如何覆盖JUnit测试类中调用JOptionPane.showMessageDialog窗口的方法哇,这太棒了!实际上,我刚刚决定在视图类中移动JOptionPane.showMessageDialog并在那里触发它。因为我不需要在GUI类上运行任何JUnit测试,所以我不必处理弹出窗口。不过我很感激你的努力!这个论坛总是让我感到惊讶。非常感谢。