Reputation: 21
I am getting below error while implementing data driven framework using @Dataprovide in TestNG. I am reading data from excel file and storing it in the Array List which is then passed to the test using Data Provider. But, upon executing the test, I am getting Data Provider mismatch error. Please help.
Error:
FAILED: register
org.testng.internal.reflect.MethodMatcherException:
[public void com.bravura.tests.DataProviderTest.register(java.lang.String,java.lang.String,java.lang.String,java.lang.String)] 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: register([Parameter{index=0, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=1, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=2, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=3, type=java.lang.String, declaredAnnotations=[]}])
Arguments: [([Ljava.lang.Object;) [Lallu, Yadav, [email protected], Naukri@2021]]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:43)
at org.testng.internal.Parameters.injectParameters(Parameters.java:914)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:34)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at org.testng.TestRunner.privateRun(TestRunner.java:794)
at org.testng.TestRunner.run(TestRunner.java:596)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
at org.testng.SuiteRunner.run(SuiteRunner.java:276)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
at org.testng.TestNG.runSuites(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Test:
package com.bravura.tests;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.bravura.utilities.TestUtil;
public class DataProviderTest {
WebDriver driver;
@BeforeMethod
public void setUp() {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\ssaxena\\Downloads\\Selenium\\Drivers\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().deleteAllCookies();
driver.manage().window().maximize();
driver.get("https://www.ebay.com/");
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
}
@DataProvider
public Iterator<Object> getInputData() {
ArrayList<Object> testData = TestUtil.getDataFromExcel();
return testData.iterator();
}
@Test(dataProvider = "getInputData")
public void register(String fname, String Lname, String email, String password) {
driver.findElement(By.linkText("register")).click();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.findElement(By.id("firstname")).sendKeys(fname);
driver.findElement(By.name("lastname")).sendKeys(Lname);
driver.findElement(By.cssSelector("#Email")).sendKeys(email);
driver.findElement(By.xpath("//input[@name = 'password']")).sendKeys(password);
driver.findElement(By.className("btn btn--primary btn--large btn--fluid")).click();
}
@AfterMethod
public void tearDown() {
driver.quit();
}
}
Data Provider Method
package com.bravura.utilities;
import java.util.ArrayList;
import java.util.Arrays;
public class TestUtil {
static ReadExcelData reader = new ReadExcelData("D:\\SelemiumWorkspace\\SeleniumBasics\\Stores\\EbayRegistration.xlsx");
public static ArrayList<Object> getDataFromExcel() {
ArrayList<Object> dataList = new ArrayList<Object>();
try {
ReadExcelData reader = new ReadExcelData("D:\\SelemiumWorkspace\\SeleniumBasics\\Stores\\EbayRegistration.xlsx");
}catch (Exception e) {
e.printStackTrace();
}
for(int i =2; i <= reader.getRowCount("RegistrationData"); i++) {
String fname = reader.getCellData("RegistrationData", "FirstName", i);
String Lname = reader.getCellData("RegistrationData", "LastName", i);
String email = reader.getCellData("RegistrationData", "Email", i);
String password = reader.getCellData("RegistrationData", "Password", i);
dataList.add(new Object[] {fname, Lname, email, password});
}
return dataList;
}
}
Upvotes: 1
Views: 1487
Reputation: 5917
Because Data provider must return Object[][] or Iterator<Object[]>
, so I change your code a little bit and it works.
public static List<Object[]> getDataFromExcel() {
List<Object[]> dataList = new ArrayList<>();
....
}
@DataProvider
public Iterator<Object[]> getInputData() {
return TestUtil.getDataFromExcel().iterator();
}
Upvotes: 1