Как написать тест для сериализации и десериализации, который включает в себя JAVAFX файл выбора? - PullRequest
0 голосов
/ 01 мая 2018

Мне нужно написать модульные тесты для функций serialization () и deserialization (), которые я не знаю, как охватить FileChooser и FileInputStream.

А также, если в этом файле две функции, я должен написать две и только две соответствующие тестовые функции?

Две функции:

/**
 * serialize and save all the datasets and charts
 * @param myDataset
 *          pass all the existing datasets into this function for serialization purpose
 * @param myChart
 *          pass all the existing charts into this function for serialization purpose
 */

public static void serialize (HashMap<String, DataTable> myDataset, HashMap<String, Chart> myChart) {

    // first, let the user select a directory to save
    FileChooser chooser = new FileChooser();
    chooser.setTitle("Save");
    FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("comp3111 type", "*.comp3111");
    chooser.getExtensionFilters().add(extFilter);
    File file = chooser.showSaveDialog(new Stage());

    try {
        FileOutputStream fOutput = new FileOutputStream(file);
        ObjectOutputStream objOutput = new ObjectOutputStream(fOutput);

        // put all the DataTable type objects into an array         
        objOutput.writeObject(myDataset);
        objOutput.writeObject(myChart);

        objOutput.close();
        fOutput.close();

    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }

}


/**
 * choose a file with *.comp3111 extension for deserialization purpose
 * @return
 *          the chosen *.comp3111 file
 */
public static File deserialize () {
    FileChooser chooser = new FileChooser();
    FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("comp3111 type", "*.comp3111");
    chooser.getExtensionFilters().add(extFilter);

    File mfile = chooser.showOpenDialog(new Stage());           
    return mfile;
}

1 Ответ

0 голосов
/ 01 мая 2018

Проблема в том, что у вас есть код в ваших serialize и deserialize методах, которые там не принадлежат. Они слишком широки: они не только сериализуют и десериализуют объекты (хотя код для десериализации, по-видимому, отсутствует), они также открывают средства выбора файлов.

Хотя это может иметь смысл с точки зрения потока программ, оно также нарушает принцип единственной ответственности (примечание: я знаю, что SRP обычно применяется к классу, а не к методу) , Ваши методы делают слишком много вещей.

Таким образом, вы должны написать свои методы таким образом, чтобы они принимали File или InputStream в качестве входного параметра и возвращали коллекцию объектов в результате (для десериализации), или принимали коллекцию объектов и вернуть OutputStream как результат (для сериализации). Таким образом, вы можете проверить именно это поведение.

Еще лучше было бы сначала написать тест, где вы могли бы, например, использовать тестовый файл, оба из которых можно прочитать, чтобы проверить, производит ли он ожидаемые объекты, или вы проверяете, что ByteOutputStream, возвращаемый сериализатором, соответствует тому, что тот же файл.

Это называется разработка через тестирование , и это хороший способ написать тестируемый и стабильный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...