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

标签 java swing unit-testing joptionpane

我有一个 java swing 应用程序,它希望用户选择 YESNO来自 JOptionPane.showConfirmDialog

由于 JOptionPane 停止线程并等待用户输入,我的代码无法自动测试。

无论如何,我可以通过编程方式解决这个问题吗?或者模拟是或否?

在我现在的测试中,会出现一个确认对话框,我必须在其中按下是或否按钮。

更新

我找到了一个绝妙的选择。

我创建了一个名为 OptionPane 的接口(interface)基本上包含我需要的所有不同类型的消息。 然后我创建了一个默认实现,它只归属于 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());

最佳答案

优雅的方法是修改代码以期待来自界面的答案,比如

public interface UserAnswer {
    boolean yesPressed();
}

然后使用 JOptionPane.showConfirmDialog 实现它用于生产代码,并硬编码用于测试代码。

如果这不可能,您可以尝试使用 EventQueue.invokeLater 将事件分发线程上的事件发送到 JOptionPane。

关于java - 如何使用 Java Swing JOptionPane 确认对话框进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11522483/

相关文章:

java - 获取要执行的php页面上通过ajax传递的值

java - 用java发送短信

java - 将 Paper 设置为 PageFormatter 不会更新 PageFormatter

java - JMenuBar、JMenu 和 JMenuItem 的高度

javascript - 为什么这个 QUnit 测试失败?

java - 如何在 ListView 布局中显示结果?

java - 如果Spring Batch满载,在哪里删除表?

java - 当按键释放时,将 jSpinner 的值反射(reflect)在 jLabel 上

unit-testing - 在Grails 2中使用build-test-data插件

python - 如何在 Django 单元测试中访问 Django 消息框架内容