Java JUnit使用JOptionPane.showMessageDialog测试方法

Java JUnit使用JOptionPane.showMessageDialog测试方法,java,joptionpane,Java,Joptionpane,我做了一个游戏,用户和AI轮流“掷”骰子。游戏会自动轮到AI并返回到用户的轮到。我使用JOptionPane.showMessageDialog弹出一个对话框,通知用户轮到他们了。所有这些都正常工作,但是当我执行JUnit测试类来测试hold()方法时,弹出窗口出现了。有没有办法在JUnit测试类中抑制弹出窗口或自动关闭窗口 public void hold() { this.swapWhoseTurn(); this.setChanged();

我做了一个游戏,用户和AI轮流“掷”骰子。游戏会自动轮到AI并返回到用户的轮到。我使用JOptionPane.showMessageDialog弹出一个对话框,通知用户轮到他们了。所有这些都正常工作,但是当我执行JUnit测试类来测试hold()方法时,弹出窗口出现了。有没有办法在JUnit测试类中抑制弹出窗口或自动关闭窗口

    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测试,所以我不必处理弹出窗口。不过我很感激你的努力!这个论坛总是让我感到惊讶。非常感谢。