我有一个 java swing 应用程序,它希望用户选择YES
或NO
从中选择JOptionPane.showConfirmDialog
由于 JOptionPane 停止线程并等待用户输入,因此我的代码无法自动测试。
无论如何我可以以编程方式解决这个问题吗?或模拟是或否?
在我现在的测试中,会出现一个确认对话框,我必须在其中按下是或否按钮。
更新
我找到了一个绝妙的选择。
我创建了一个接口,调用OptionPane
了我需要的所有不同类型的消息。然后我创建了一个默认实现,它只归入 JOptionPane 的静态方法。然后我创建了一个 YesMockOptionPane,它基本上为所有确认消息返回 YES_OPTION,为所有 NO_OPTIONS 返回一个 NoMockOptionPane。
这是代码:
<<usage>>
class Foo {
OptionPane optionPane = new DefaultOptionPane();
public void someMethod() {
if (optionPane.showConfirmDialog(null, "choose yes or no", "Please confirm",
JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION)
return;
//User pressed yes
}
public void setOptionPane(OptionPane o) {
this.optionPane = o;
}
}
//Snippet of the interface
public interface OptionPane {
int showConfirmDialog(Component parentComponent,
Object message, String title, int optionType);
}
public class DefaultOptionPane implements OptionPane {
@Override
public int showConfirmDialog(Component parentComponent,
Object message, String title, int optionType) {
return JOptionPane.showConfirmDialog(parentComponent,message,title,optionType);
}
}
public class YesMockOptionPane extends DefaultOptionPane {
//MockOptionPane is just an abstract class implementing default methods from OptionPane
@Override
public int showConfirmDialog(Component parentComponent, Object message, String title, int optionType) {
return JOptionPane.YES_OPTION;
}
}
现在在单元测试中我可以简单地设置适当的 MockOptionPane。
dialog.setOptionPane(new YesMockOptionPane());