Как создать новый раздел в провайдере данных ini4j

Я читаю из INI-файлов и передаю их через провайдеров данных для тестирования.

(Поставщик данных читает их и возвращает Ini.Section[][] массив. Если есть несколько разделов, testng запускает тест столько раз.)

Давайте представим, что есть такой раздел:

[sectionx]
key1=111
key2=222
key3=aaa,bbb,ccc

В итоге я хочу прочитать эти данные и выполнить тестовый сценарий три раза, каждый раз с другим значением key3, остальные ключи одинаковы.

Один из способов - скопировать и вставить раздел столько раз, сколько необходимо... что явно не идеальное решение.

Казалось бы, для этого нужно создать дополнительные копии раздела, а затем изменить значения ключей на aaa, bbb а также ccc, Поставщик данных вернет новый массив, а testng сделает все остальное.

Тем не менее, я не могу создать новый экземпляр объекта section. Ini.Section на самом деле интерфейс; реализующий класс org.ini4j.BasicProfileSection не видно Похоже, невозможно создать копию объекта или наследовать класс. Я могу только манипулировать существующими объектами этого типа, но не создавать новые. Есть ли способ обойти это?

1 ответ

Решение

Кажется, что невозможно создать копии разделов или INI-файлов. Я закончил тем, что использовал этот обходной путь:

Сначала создайте "пустой" INI-файл, который будет служить своего рода заполнителем. Это будет выглядеть так:

    [env]
    test1=1
    test2=2
    test3=3

    [1]
    [2]
    [3]

... с достаточно большим количеством разделов, равным или большим количеством разделов в других файлах INI.

Во-вторых, прочитайте данные в поставщике данных. Когда есть ключ, который содержит несколько значений, создайте новый Ini объект для каждого значения. Новый Ini объект должен быть создан из нового файлового объекта. (Вы можете читать файл заполнителя снова и снова, создавая любое количество Ini файлы.)

Наконец, вы должны скопировать содержимое самого ini-файла в файл-заполнитель.

У меня работает следующий код:

    public static Ini copyIniFile(Ini originalFile){
        Set<Entry<String, Section>> entries = originalFile.entrySet();
        Ini emptyFile;
        try {
            FileInputStream file = new FileInputStream(new File(EMPTY_DATA_FILE_NAME));
            emptyFile = new Ini(file);
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        for(Entry<String, Section> entry : entries){
            String key = (String) entry.getKey();
            Section section = (Section) entry.getValue();
            copySection(key, section, emptyFile);
        }

        return emptyFile;
    }

    public static Ini.Section copySection(String key, Ini.Section origin, Ini destinationFile){
        Ini.Section newSection = destinationFile.get(key);
        if(newSection==null) throw new IllegalArgumentException();
        for(Entry<String, String> entry : origin.entrySet()){
            newSection.put(entry.getKey().toString(), entry.getValue().toString());
        }
        return newSection;
    }
Другие вопросы по тегам