I am reading data from Excel and passing the data to the Test using Dataproviders. I have 5 parameters, but the Test method looks clumpsy. So, I want to pass a single parameter instead of many. I have tried to do that but the Test got failed with below error:
java.lang.ClassCastException: com.utils.ExcelUtil$TestData cannot be cast to [Ljava.lang.Object;
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1225)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Please find my code below:
Test.java
@DataProvider
public Iterator<TestData> getData() throws IOException {
List<TestData> data = excelUtil().getDataFromExcel();
return data.iterator();
}
@Test(dataProvider = "getData")
public void verify(TestData testData) {
System.out.println("Value of t1 : " + testData.t1);
}
ExcelUtil.java
public ExcelUtil(String path) throws IOException {
stream = new FileInputStream(path);
workbook = WorkbookFactory.create(stream);
workSheet = workbook.getSheetAt(0);
}
public List<TestData> getDataFromExcel() {
DataFormatter dataFormatter = new DataFormatter();
List<TestData> data = new ArrayList<TestData>();
Iterator<Row> rowIterator = workSheet.iterator();
TestData testResourceData = new TestData();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
if (row.getRowNum() == 0) {
continue;
}
resourceData.t1 = row.getCell(0).getStringCellValue();
resourceData.t2 = row.getCell(1).getStringCellValue();
Double value = Double.parseDouble(dataFormatter.formatCellValue(row.getCell(2)));
Long longValue = value.longValue();
resourceData.t3 = String.valueOf(longValue.toString());
resourceData.t4 = row.getCell(3).getStringCellValue();
resourceData.t5 = row.getCell(4).getStringCellValue();
data.add(resourceData);
}
return data;
}
public class TestData {
public String t1;
public String t2;
public String t3;
public String t4;
public String t5;
}
Please suggest a best way to pass the Data as a single argument. Thanks..