TestNG 数据提供程序将对象二维数组转换为 Hashtable - 抛出 MethodMatcherException

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?