Как сделать этот код SwingWorker тестируемым
Рассмотрим этот код:
public void actionPerformed(ActionEvent e) {
setEnabled(false);
new SwingWorker<File, Void>() {
private String location = url.getText();
@Override
protected File doInBackground() throws Exception {
File file = new File("out.txt");
Writer writer = null;
try {
writer = new FileWriter(file);
creator.write(location, writer);
} finally {
if (writer != null) {
writer.close();
}
}
return file;
}
@Override
protected void done() {
setEnabled(true);
try {
File file = get();
JOptionPane.showMessageDialog(FileInputFrame.this,
"File has been retrieved and saved to:\n"
+ file.getAbsolutePath());
Desktop.getDesktop().open(file);
} catch (InterruptedException ex) {
logger.log(Level.INFO, "Thread interupted, process aborting.", ex);
Thread.currentThread().interrupt();
} catch (ExecutionException ex) {
Throwable cause = ex.getCause() == null ? ex : ex.getCause();
logger.log(Level.SEVERE, "An exception occurred that was "
+ "not supposed to happen.", cause);
JOptionPane.showMessageDialog(FileInputFrame.this, "Error: "
+ cause.getClass().getSimpleName() + " "
+ cause.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
} catch (IOException ex) {
logger.log(Level.INFO, "Unable to open file for viewing.", ex);
}
}
}.execute();
url
является JTextField, а 'creator' - это внедренный интерфейс для записи файла (поэтому эта часть находится в стадии тестирования). Место, в которое записан файл, намеренно жестко запрограммировано, поскольку это является примером. И java.util.logging используется просто, чтобы избежать внешней зависимости.
Как бы вы разбили это на части, чтобы сделать его модульно-тестируемым (включая отказ от SwingWorker, если необходимо, но затем замените его функциональность, по крайней мере, как здесь используется).
С моей точки зрения, с doInBackground все в порядке. Фундаментальная механика создает писателя и закрывает его, что слишком просто для тестирования, а реальная работа находится в стадии тестирования. Однако метод done является кавычкой проблематичным, включая его связь с методом actionPerformed родительским классом и координацию включения и выключения кнопки.
Тем не менее, это не очевидно. Внедрение некоторого вида SwingWorkerFactory усложняет ведение захвата полей графического интерфейса пользователя (трудно понять, как это будет улучшать дизайн). JOpitonPane и рабочий стол обладают всеми «достоинствами» синглетонов, а обработка исключений делает невозможным простую упаковку.
Итак, что было бы хорошим решением для тестирования этого кода?