如何在创建模态JDialog的按钮上编写JUnit测试?

时间:2017-07-11 15:46:30

标签: java swing junit

我目前正在开发一个java swing应用程序,它可以从用户那里获得几个输入。有一次,我有一个JButton谁的动作监听器产生一个模态JDialog框架,用户将输入数据。然后按钮获取数据并用它做一堆东西。问题是我需要测试JButton以确保它正常运行,但单元测试会在它生成新帧时立即停止,因为它是模态的。如何测试按钮实际上是否会产生一个新窗口,其余的按钮功能是否有效?

注意:

  • 我不能frame.setModal(false);,因为它包含在actionlistner中。
  • 我不能添加一个检查来改变它是否是模态的,这取决于来电的来源,因为它会打败写测试点
  • 我不能简单地使框架永久不是模态的,因为我想确保用户在对话框打开时不与其他框架交互。

示例代码:

    public void actionPerformed(ActionEvent e) {
        InputDialog inputDialog = new InputDialog(button);
        String value = inputDialog.open();

        // I then do a bunch of stuff with value
    }

-

    public class InputDialog extends JDialog {

        private JTextField field;

        public String getInput() {
            this.setVisible(true);
            String result = field.getText();
            return result;
        }

        public InputDialog(Component c){
            // set the window settings
            this.setUndecorated(true); // Remove title bar
            this.setLayout(null);
            this.setModal(true); // stops interactions with other windows
            this.setLocationRelativeTo(c);
            this.setSize(200, 125);

            // make panel
            JPanel panel = new JPanel();
            panel.setBounds(0, 0, 200, 125);
            panel.setLayout(null);
            panel.setBackground(new Color(197, 211, 234));
            panel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));

            // set up field
            field = new JTextField();
            field.setBounds(25, 25, 150, 25);
            panel.add(field);

            // set up enter button
            JButton button = new JButton("Submit Value");
            button.setBounds(25, 75, 150, 25);
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    me.dispose();
                }
            });
            panel.add(button);

            this.add(panel);
        }


    }

2 个答案:

答案 0 :(得分:0)

我认为你不希望你的单元测试打开任何UI框架/对话框。尝试使用类似PowerMock和模拟InputDialog构造函数的模拟库来返回模拟InputDialog,并添加期望InputDialog.opne()方法在您以编程方式单击时调用JButton

答案 1 :(得分:0)

当然,测试产品的所有方面非常重要。但你的方法已经存在缺陷。

首先:您应该非常小心将哪些代码放入ActionListeners中。含义:在event dispatcher thread上调用这些方法。当你在该线程上做“太多”时,你会放慢速度,甚至冻结完整的用户界面。

然后:您必须完全从业务逻辑中隔离UI代码。任何与计算值有关的东西都应该分成不同的类 - 然后用隔离进行测试。

换句话说:你的ActionListener没有“用value做事” - 如果有的话,监听器知道如何使用其他类来“做那些事情”。