JUnit使用JOptionPane.showMessageDialog测试方法

时间:2015-07-02 01:35:22

标签: java joptionpane

我做了一个游戏,用户和AI轮流使用#34;滚动"一个骰子。游戏自动转动AI并返回用户的回合。我使用JOptionPane.showMessageDialog弹出一个对话框,通知用户轮到他们了。所以这一切都正常工作但是当我执行一个JUnit测试类来测试hold()方法时,弹出窗口就出现了。有没有办法在JUnit Test类中禁止弹出窗口或自动关闭窗口?

    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_Option按钮上调用doClick方法,但我不太清楚如何找到该按钮。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

重构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();
}

让我们假设上面的类叫做Game。在您的测试代码中,按如下方式扩展Game类:

...
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。我亲自尝试了其中几个,我建议你看看Jmockit。用它来处理这种麻烦几乎是微不足道的,这样你就可以专注于你想要/需要测试的东西。

干杯。