У меня есть приложение 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());