2014-01-17 34 views
0

我正在從ini文件讀取數據,並通過數據提供者將它們傳遞給測試用例。如何在數據提供者中創建新節ini4j

(數據提供程序讀取這些並返回一個Ini.Section[][]陣列如果有幾個部分,TestNG的運行測試,很多次。)

讓我們想象有這樣一段:

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

我最終想要讀取這些數據並執行三次測試用例,每次使用不同的key3值,其他鍵都是相同的。

一種方法是複製&根據需要粘貼該部分......這顯然不是理想的解決方案。

這種方式似乎會創建該部分的更多副本,然後將鍵值更改爲aaa,bbbccc。數據提供者將返回新的數組,testng將完成剩下的工作。

但是,我似乎無法創建節對象的新實例。 Ini.Section實際上是一個接口;實施類org.ini4j.BasicProfileSection不可見。看起來不可能創建該對象的副本,或者繼承該類。我只能操作這種類型的現有對象,但不能創建新的對象。有沒有辦法解決它?

回答

0

似乎無法創建節或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; 
    }