Shubham Saxena
Shubham Saxena

Reputation: 21

Getting <org.testng.internal.reflect.MethodMatcherException> Data provider mismatch error in Selenium with TestNG

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

Answers (1)

lucas-nguyen-17
lucas-nguyen-17

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

Related Questions