Как выполнить модульное тестирование с помощью диалогового окна подтверждения Java Swing JOptionPane

У меня есть приложение Java Swing, которое ожидает, что пользователи выберут YESили NOиз JOptionPane.showConfirmDialog

. Поскольку JOptionPane останавливает поток и ожидает ввода данных пользователем, мой код не подлежит автоматическому тестированию.

Можно ли как-то обойти это программно? Или смоделировать да или нет?

В моем тесте сейчас появляется диалоговое окно подтверждения, где я должен нажать кнопку «да» или «нет».

Обновление

Я нашел блестящий вариант.

Я создал интерфейс под названием OptionPaneпрактически со всеми типами сообщений, которые мне нужны. Затем я создал реализацию по умолчанию, которая просто отсылает к статическим методам JOptionPane `. Затем я создал YesMockOptionPane, который в основном возвращает YES _OPTION для всех подтверждающих сообщений и NoMockOptionPane для всех NO _OPTIONS.

Вот код:

<<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());
5
задан user1585643 23 March 2013 в 21:41
поделиться