She*_*ari 5 java swing unit-testing joptionpane
我有一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在在单元测试中,我可以简单地设置适当的MockOptionPane.
dialog.setOptionPane(new YesMockOptionPane());
Run Code Online (Sandbox Code Playgroud)
这是我想出的解决方案(也在问题中复制)
<<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 MockOptionPane {
@Override
public int showConfirmDialog(Component parentComponent, Object message, String title, int optionType) {
return JOptionPane.YES_OPTION;
}
}
Run Code Online (Sandbox Code Playgroud)
现在在单元测试中我可以简单地设置适当的 MockOptionPane。
dialog.setOptionPane(new YesMockOptionPane());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3959 次 |
| 最近记录: |