如何使用Java Swing JOptionPane确认对话框进行单元测试

She*_*ari 5 java swing unit-testing joptionpane

我有一个java swing应用程序,期望用户选择YESNO来自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)

She*_*ari 3

这是我想出的解决方案(也在问题中复制)

<<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)