Как сделать этот код 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 и рабочий стол обладают всеми «достоинствами» синглетонов, а обработка исключений делает невозможным простую упаковку.

Итак, что было бы хорошим решением для тестирования этого кода?

Ответы на вопрос(3)

Ваш ответ на вопрос