如何解决TestNG 数据提供程序将对象二维数组转换为 Hashtable - 抛出 MethodMatcherException
我定义了数据提供程序以从 Excel 表中获取数据并将其传递给测试的测试方法。我能够从 excel 获取和读取数据,但是当将其传递给被测测试方法时,它抛出 MethodMatcherException
来自 dataProvider 的代码
@DataProvider(name = "testdatasupply")
public Object[][] ReadDetails() throws IOException {
HashMap<String,String> rowdata=new HashMap<String,String>();
File file=new File("src/main/resources/TestData.xlsx");
FileInputStream fis=new FileInputStream(file);
XSSFWorkbook wb= new XSSFWorkbook(fis);
XSSFSheet sheet=wb.getSheet("API");
Row key=sheet.getRow(0);
int rowcount=sheet.getPhysicalNumberOfRows();
int columncount=key.getLastCellNum();
Object[][] data1 =new Object[rowcount][columncount];
for(int i=0;i<sheet.getPhysicalNumberOfRows()-1;i++) {
Row row = sheet.getRow(i+1);
if(row.getCell(2).getStringCellValue().equalsIgnoreCase("Yes")){
for (int j = 0; j < row.getLastCellNum(); j++) {
rowdata.put(key.getCell(j).getStringCellValue(),row.getCell(j).getStringCellValue());
}
data1[i][0]=rowdata;
System.out.println(data1[i][0]);
}
}
return data1;
}
我的测试班正在测试中。
@Test(dataProvider = "testdatasupply",dataProviderClass = TestData.ReadData.class)
public void APITesting(Hashtable<String,String> data){
System.out.println(data);
String API= data.get("API Name");
switch (API.toLowerCase()){
case "petstore/get":
System.out.println(data.get("ID"));
case "petstore/post":
System.out.println(data.get("ID")+"from secnd");
}
}
当我运行上面的代码时,我得到 org.testng.internal.reflect.MethodMatcherException
: 这表明返回类型与预期不匹配。由于我有更多的列,因此将其作为单个字符串并没有帮助,因为我必须创建更多数量的变量。
[public void TestRunner.main.testrunner.APITesting(java.util.Hashtable)] has no parameters defined but was found to be using a data provider (either explicitly specified or inherited from class level annotation).
Data provider mismatch
Method: APITesting([Parameter{index=0,type=java.util.Hashtable,declaredAnnotations=[]}])
任何人都可以建议将其设为 Hashtable
或我在这里做错了什么的最佳方法吗?
解决方法
您的数据提供者为每个测试返回一个 HashMap
,而您的测试方法需要一个 Hashtable
类型的参数。这两个是不同的数据类型。但两者都有一个共同的接口 Map
。
因此,在您的测试方法中,更改如下:
public void APITesting(Map<String,String> data)
在您的数据提供程序中更改为:(不是必需的,但推荐):
Map<String,String> rowdata=new HashMap<String,String>();
此外,您的代码 dataprovider 代码存在一些问题 - 循环内使用了相同的映射 rowdata
,因此对于每次测试运行,传递给测试方法的数据都是相同的,因为您正在执行 { data1[i][0]=rowdata;
循环中的 {1}}。
我认为你应该这样做:
i
,
您的代码似乎不正确,您可以执行以下操作:
1)。第一个解决方案:
a) @Test 方法不能让 public void APITesting(Hashtable<String,String> data)
尝试将其替换为 public void APITesting(String API,String ID)
b) 在数据提供者中尝试返回 ID 和 API。您需要在返回数据之前对其进行解析。在 dataprovider 方法中,您需要获取 API 和 ID,然后将其传递给 @test
方法。
data1[i][0]=APIData;
data1[i][1]=ID;
代码:
@Test(dataProvider = "testdatasupply",dataProviderClass = TestData.ReadData.class)
public void APITesting(String API,String ID) {
switch (API.toLowerCase()) {
case "petstore/get":
System.out.println(ID);
case "petstore/post":
System.out.println(ID + "from secnd");
}
}
2) 第二种解决方案:
由于您无法传递 public void APITesting(Hashtable<String,String> data)
,请尝试再次将其替换为 public void APITesting(String data)
,然后再次将字符串转换为哈希表。
代码:
@Test(dataProvider = "testdatasupply",dataProviderClass = TestData.ReadData.class)
public void APITesting(String data) {
String a = data.toString();
a = a.replaceAll("[{}]","");
System.out.println(a);
// New HashTable obj
Hashtable<String,String> hashTable
= new Hashtable<String,String>();
// split the String by a comma
String parts[] = a.split(",");
// iterate the parts and add them to a HashTable
for (String part : parts) {
String subData[] = part.split("=");
String api = subData[0].trim();
String id = subData[1].trim();
// Add to hashTable
hashTable.put(api,id);
}
System.out.println("String to HashTable: " + hashTable);
System.out.println(hashTable.get("API"));
System.out.println(hashTable.get("id"));
String API= hashTable.get("API Name");
switch (API.toLowerCase()){
case "petstore/get":
System.out.println(hashTable.get("ID"));
case "petstore/post":
System.out.println(hashTable.get("ID")+"from secnd");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。