java - 使用 TestNg DataProvider 时出错必须返回 Object[][] 或 Iterator<Object>[],而不是类 [[Ljava.lang.Object;

标签 java selenium apache-poi testng testng-dataprovider

测试用例:

package Test;
import org.testng.annotations.AfterTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import Page.LoginPage;
import Utility.TestDataProvider;
import Utility.TestUtil;
//Testcase to perform login 
public class LoginTest  {
LoginPage page=new LoginPage();

@Test(dataProvider="ExcelDataProvider",dataProviderClass=TestDataProvider.class)
public void Logintest(String username,String password){

//page.login("user@phptravels.com","demouser");
page.login(username,password);
    }
@AfterTest
public void TearDown(){
    TestUtil.quit();
}
} 

数据提供者:

     package Utility;
        import org.testng.annotations.DataProvider;
        import org.testng.annotations.Parameters;
        import org.testng.annotations.Test;
        public class TestDataProvider {
        static ExcelReader reader=new ExcelReader();
        @DataProvider(name="ExcelDataProvider")
       public static Object[][] ExcelDataProvider()
         {
        Object [][] rest = reader.readDataExcel("UserLogin");
        return rest;
    }
     }

Excel阅读器:

package Utility;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class ExcelReader {

    static String fileName="Testdata";
    public Object[][] readDataExcel(String TableName){
        String filePath="F:\\TravelSite\\TravelSiteAutomation\\Testdata.xlsx";
        File file =new File(filePath);


        try{
        FileInputStream stream=new FileInputStream(file);
              Workbook workbook  = new XSSFWorkbook(stream);
              XSSFSheet sheet=(XSSFSheet) workbook.getSheet("UnitTest");
                 List<XSSFTable> tables = sheet.getTables();

                 for(XSSFTable table:tables){
                     String name=table.getName();
                     if(name.equals(TableName)){


                         int ci=0,cj=0;
                        int rowNum=sheet.getLastRowNum()-sheet.getFirstRowNum();
                        //System.out.println(rowNum);


                        String[][] dataArray=new String[rowNum][100];
                        for(int i = 1; i < rowNum+1; i++) {

                            Row row = sheet.getRow(i);



                            //Create a loop to print cell values in a row
                            int colNum=row.getLastCellNum();
                           // System.out.println(colNum);
                            for(int j = 0; j <colNum; j++) {


                                //Print excel data in console
                                  Cell cell=row.getCell(j);
                                  DataFormatter formatter = new DataFormatter();
                                  String var_name = formatter.formatCellValue(cell);
                               System.out.print(var_name+" || ");
                               dataArray[ci][cj]=var_name;

                            }

                            System.out.println();
                           }
                        workbook.close();

                return dataArray;   
                        }   

                     }
                 Log.info("Table name is incorrect");
                 return null;
                 }



            catch(Exception e)

        {
                Log.debug(e.getMessage());


                return null;
            }
        }
    }

所以当我尝试运行测试用例时我收到错误 org.testng.TestNGException:

Data Provider public static java.lang.Object[][] Utility.TestDataProvider.ExcelDataProvider() must return either Object[][] or Iterator[], not class [[Ljava.lang.Object;

似乎没有什么可以解决它,POI 版本 3.15,TestNG 版本 6.10

最佳答案

问题出在 ExcelReader 类上。请在下面找到应该解决问题的相同修复版本

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.ArrayList;
import java.util.List;

public class ExcelReader {

    public static String[][] readDataExcel(String TableName) {
        String filePath = "src/test/resources/Testdata.xlsx";
        try {
            Workbook workbook = new XSSFWorkbook(filePath);
            XSSFSheet sheet = (XSSFSheet) workbook.getSheet("UnitTest");
            List<XSSFTable> tables = sheet.getTables();

            for (XSSFTable table : tables) {
                String name = table.getName();
                if (! name.equals(TableName)) {
                    continue;
                }
                int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum();
                System.out.println(rowCount);
                int columnCount = - 1;
                List<List<String>> data = new ArrayList<>();
                for (int i = 1; i < rowCount + 1; i++) {
                    Row row = sheet.getRow(i);
                    int colNum = row.getLastCellNum();
                    if (columnCount == - 1) {
                        columnCount = colNum;
                    }
                    List<String> rowData = new ArrayList<>();
                    for (int j = 0; j < colNum; j++) {
                        Cell cell = row.getCell(j);
                        DataFormatter formatter = new DataFormatter();
                        String var_name = formatter.formatCellValue(cell);
                        if (var_name != null && ! var_name.trim().isEmpty()) {
                            rowData.add(var_name);
                        }
                    }
                    if (! rowData.isEmpty()) {
                        data.add(rowData);
                    }
                }
                workbook.close();
                String[][] dataArray = new String[rowCount-1][columnCount];
                int rowIndex = 0;
                for (List<String> row : data) {
                    int colIndex = 0;
                    for (String rowData : row) {
                        dataArray[rowIndex][colIndex++] = rowData;
                    }
                    rowIndex++;
                }
                return dataArray;
            }
            System.err.println("Table name is incorrect");
            return new String[][] {{}};
        } catch (Exception e) {
            e.printStackTrace();
            return new String[][] {{}};
        }
    }
}

关于java - 使用 TestNg DataProvider 时出错必须返回 Object[][] 或 Iterator<Object>[],而不是类 [[Ljava.lang.Object;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42505444/

相关文章:

java - 在 Firefox 31 和 Selenium 2.42.2 上查找 <select> 元素非常慢

java - 有没有办法使用 Apache POI 将大图像添加到 xls 文件中?

java - 使用 Apache POI 3.14 获取 Excel 中公式的计算值

java - 使用 TreeMap<Integer, ArrayList<Station>> 中的值更新 ArrayList<Station>

java - 递归比较两个json节点并在java中打印不同的值

firefox - 如何使用 webdriver 在 Firefox 中禁用阅读器 View

apache-poi - 如何在 Java 中解析严格的 *.xlsx 文件

基于Java的移动应用+IIS服务器

Java最佳实践或是否有任何设计模式来保存与该类没有直接关系的数据

python - 如何使用 python selenium 登录 Openload.co?