我正在读取ini文件,并通过数据提供程序将它们传递给测试用例。
(数据提供程序读取这些并返回一个Ini.Section[][]
数组。如果有几个部分,testng会多次运行测试。)
让我们想象一下有这样一个部分:
[sectionx]
key1=111
key2=222
key3=aaa,bbb,ccc
最后,我想要的是读取这些数据并执行测试用例三次,每次都使用不同的key3值,其他键都相同。
一种方法是复制&根据需要多次粘贴该节。。。这显然不是一个理想的解决方案。
这样做的方法似乎是创建该部分的更多副本,然后将键值更改为aaa
、bbb
和ccc
。数据提供者将返回新的数组,剩下的由testng完成
但是,我似乎无法创建section对象的新实例。Ini.节实际上是一个接口;实现类CCD_ 5是不可见的。似乎无法创建对象的副本或继承类。我只能操作此类型的现有对象,但不能创建新对象。有办法绕过它吗?
似乎不可能创建节或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;
}