如何在方法中测试JButton ActionListener? (单元测试)

时间:2014-05-06 11:42:18

标签: java eclipse unit-testing jbutton assert

我正在Eclipse中创建一个棋盘游戏并尝试进行单元测试。对于我的单元测试,我使用的是Junit和EclEmma。在一个班级中,我试图测试如果按下一个按钮(newGameButton),它将把玩家带到contentPane"玩家详细信息"。

以下是JButton代码的相关部分:

public void createGUI() {
    JButton newGameButton = new JButton("New Game");
    newGameButton.setToolTipText("Click to start a new game");
    newGameButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            CardLayout cardLayout = (CardLayout) contentPane.getLayout();
            cardLayout.show(contentPane, "Player Details");
        pack();
    }
});

我的测试代码(在另一个类中)是:

@Test
public void testHomeButtonMainMenu()
{
    appTest.createGUI();
    appTest.newGameButton.doClick(); // I know this isn't correct, I'm trying to simulate newGameButton being pressed
    Assert.assertTrue(); // somehow test that the game is on the player details
}

有没有人知道如何更正JButton newGameButton被按下的代码以及要写什么测试以显示测试成功?

由于

2 个答案:

答案 0 :(得分:0)

我会将您的测试分成两个完全独立的部分。单元测试 GUI下的代码,并使用类似WindowLicker的内容来驱动实际的用户界面。

本书Growing Object Oriented Software: Guided By Tests将指导您完成此操作,以及如何将测试分解为更易于管理,并为您提供设计更加灵活的系统。

答案 1 :(得分:0)

您正在使用匿名内部类。这没有什么不妥,即使它很难看。然而,就TDD而言,有什么不对的是,它不仅仅包含对封闭类的单一方法的调用。如果你这样写,你可以轻松单元测试该方法,而无需按任何按钮;)

测试将断言方法执行时预期发生的方法的封闭类的状态更改。由于这种方法是无效的,所以你不能在单元测试中断言任何其他东西。

更进一步,在Button上执行的命令不必靠近具有该Button的UI组件(许多按钮,实际上主要影响其他组件)。您只需创建一个抽象来帮助您传递命令对象。如果您有兴趣,可以查看这篇文章http://bo2framework.blogspot.gr/2013/08/bo2-concepts-part-1-service-panels.html

就测试GUI而言,您很可能需要一个黑盒测试工具。不幸的是,我不熟悉Swing应用黑盒测试,但“摇摆黑盒测试”将是一个很好的谷歌搜索。