getting error : Data provider mismatch Method: loginTest

74 Views Asked by At

Please help me to resolve this issue. I am trying to extract data from Json using data provider for one of my test case. I have done the below code.

This below method is in base class :

public List<HashMap<String, String>> getJsonDataToMap(String filePath) throws IOException {

    String jsonContent = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8);
    ObjectMapper mapper = new ObjectMapper();
    List<HashMap<String, String>> data = mapper.readValue(jsonContent, new TypeReference<List<HashMap<String, String>>>() {

    });
    return data;


}

Now Login.Test class is extending Base class and i have created these methods to extract the data from json and use in in test case :


public class LoginTest extends BaseClass {

    public static String dataPath="src/test/java/com/automationqa/testData/LoginData.json";
    @DataProvider(name = "testdatalogin")
    public Object[][] getData() throws IOException {
        List<HashMap<String, String>> data = getJsonDataToMap(dataPath);
        return new Object[][]  {{data.get(0), data.get(1)}};


    }

    @Test(dataProvider = "testdatalogin")
    public void loginTest(HashMap<String, String> input) {

        loginPage.enterUserName(input.get("userid"));
        loginPage.enterPassword(input.get("password"));
        loginPage.clickOnLogin();
        String pageTitle = driver.getTitle();
        Assertions.assertThat(pageTitle).isEqualTo("Guru99 Bank Manager HomePage");
    }

JSon file :

[
  {
    "userid": "mngr452488",
    "password": "davysav"
  },
  {
    "userid": "mgr45248xyz",
    "password": "heavyset"
  }
]

but getting below error:

org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: loginTest([Parameter{index=0, type=java.util.HashMap, declaredAnnotations=[]}])
Arguments: [(java.util.HashMap) {password=davysav, userid=mngr452488},(java.util.HashMap) {password=heavyset, userid=mgr45248xyz}]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:45)
    at org.testng.internal.Parameters.injectParameters(Parameters.java:796)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:983)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)


JSon file :

[
  {
    "userid": "mngr452488",
    "password": "davysav"
  },
  {
    "userid": "mgr45248xyz",
    "password": "heavyset"
  }
]

but getting below error:

org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: loginTest([Parameter{index=0, type=java.util.HashMap, declaredAnnotations=[]}])
Arguments: [(java.util.HashMap) {password=davysav, userid=mngr452488},(java.util.HashMap) {password=heavyset, userid=mgr45248xyz}]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:45)
    at org.testng.internal.Parameters.injectParameters(Parameters.java:796)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:983)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
1

There are 1 best solutions below

3
Alexey R. On

Your provider provides two arguments for each iteration but test method takes only one.

I think you want to do something like

@DataProvider(name = "testdatalogin")
public Object[][] getData() throws IOException {
    List<Map<String, String>> data = getJsonDataToMap(dataPath);
    return new Object[][]  {{data.get(0)}, {data.get(1)}};
}