我目前正在开发一个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);
}
}
答案 0 :(得分:0)
我认为你不希望你的单元测试打开任何UI框架/对话框。尝试使用类似PowerMock和模拟InputDialog
构造函数的模拟库来返回模拟InputDialog
,并添加期望InputDialog.opne()
方法在您以编程方式单击时调用JButton
。
答案 1 :(得分:0)
当然,测试产品的所有方面非常重要。但你的方法已经存在缺陷。
首先:您应该非常小心将哪些代码放入ActionListeners中。含义:在event dispatcher thread上调用这些方法。当你在该线程上做“太多”时,你会放慢速度,甚至冻结完整的用户界面。
然后:您必须完全从业务逻辑中隔离UI代码。任何与计算值有关的东西都应该分成不同的类 - 然后用隔离进行测试。
换句话说:你的ActionListener没有“用value
做事” - 如果有的话,监听器知道如何使用其他类来“做那些事情”。