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。用它来处理这种麻烦几乎是微不足道的,这样你就可以专注于你想要/需要测试的东西。

干杯。