org.testng.internal.reflect.MethodMatcherException

问题描述 投票:0回答:1

I have a problem with "reading" an excel file, using testNG, Selenium WebDriver and Java. I've already tried:1. changing .xlsx to .xls (XSSF to HSSF)2. changing excel's data types to Text or to General3. adding ' to my test data

Here is the error message:

org.testng.internal.reflect.MethodMatcherException: 
    [public void com.travelers.tests.SearchHotelTest.searchHotelTest(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,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: searchHotelTest([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=[]}, Parameter{index=4, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=5, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=6, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=7, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=8, type=java.lang.String, declaredAnnotations=[]}])
    Arguments: [(java.lang.String) Dubai,(java.lang.String) test,(java.lang.String) test,(java.lang.String) Jumeirah Beach Hotel,(java.lang.String) test,(java.lang.String) Oasis Beach Tower,(java.lang.String) test,(java.lang.String) Rose Rayhaan Rotana,(java.lang.String) test,(java.lang.String) test,(java.lang.String) test]

        at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:43)
        at org.testng.internal.Parameters.injectParameters(Parameters.java:909)
        at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:34)
        at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
        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:1507)
        at org.testng.TestRunner.privateRun(TestRunner.java:766)
        at org.testng.TestRunner.run(TestRunner.java:587)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
        at org.testng.SuiteRunner.run(SuiteRunner.java:286)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)
        at org.testng.TestNG.runSuites(TestNG.java:1039)
        at org.testng.TestNG.run(TestNG.java:1007)
        at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
        at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:110)

Here is my excel-reading class:

package com.travelers.helpers;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

public class ExcelHelper {

    public static Object[][] readExcelFile(File file) throws IOException {

        InputStream inputStream = new FileInputStream(file);
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        int rowNumbers = sheet.getLastRowNum();
        int colNumbers = sheet.getRow(0).getLastCellNum();
        String[][] data = new String[rowNumbers][colNumbers];

        for(int i=0;i<rowNumbers;i++) {
            Row row = sheet.getRow(i+1);
            for(int j=0;j<row.getLastCellNum();j++) {
                data[i][j] = row.getCell(j).getStringCellValue();
            }
        }

        return data;

    }

    public static void main(String[] args) throws IOException {
        Object[][] data = readExcelFile(new File("src//main//resources//files//Dane.xlsx"));
        System.out.println(data[0][0]);
        System.out.println(data[0][1]);
    }

}

and here is my testing class:

package com.travelers.tests;

import com.travelers.helpers.ExcelHelper;
import com.travelers.helpers.TestListener;
import com.travelers.pages.HomePage;
import com.travelers.pages.ResultPage;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Listeners(TestListener.class)
public class SearchHotelTest extends BaseSeleniumTest {

    @Test(dataProvider = "getData")
    public void searchHotelTest(String city, String checkInDate, String checkOutDate, String fHotel, String fPrice, String sHotel, String sPrice, String tHotel, String tPrice) {
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        driver.get("http://www.kurs-selenium.pl/demo/");
        HomePage homePage = new HomePage(driver);
        homePage.setCityHotel(city);
        homePage.setDateRange(checkInDate, checkOutDate);
        homePage.openTravellersModal();
        homePage.addAdult();
        homePage.addChild();
        homePage.performSearch();

        ResultPage resultPage = new ResultPage(driver);

        List<String> hotelNames = resultPage.getHotelNames();

        //SeleniumHelper.takeScreenshot(driver);

        //Assert.assertEquals("Jumeirah Beach Hotel",hotelNames.get(0));
        Assert.assertEquals(fHotel, hotelNames.get(0));
        Assert.assertEquals(sHotel, hotelNames.get(1));
        Assert.assertEquals(tHotel, hotelNames.get(2));
        //Assert.assertEquals(hotelNames.get(3),"Hyatt Regency Perth");

        List<String> prices = resultPage.getHotelPrices();
        Assert.assertEquals(prices.get(0),fPrice);
        Assert.assertEquals(prices.get(1),sPrice);
        Assert.assertEquals(prices.get(2),tPrice);
        //Assert.assertEquals(prices.get(3),"$151");
    }

    @DataProvider
    public Object[][] getData() {
        Object[][] data = null;
        try {
            data = ExcelHelper.readExcelFile(new File("src//main//resources//files//Dane.xlsx"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }
}
java selenium selenium-webdriver testng testng-dataprovider
1个回答
0
投票

An error occurs due to test data that does not match with the test method parameter.

Solution:

@Test(dataProvider = "getData")
    public void searchHotelTest(String city, String checkInDate, String checkOutDate, String fHotel, String fPrice,
            String sHotel, String sPrice, String tHotel, String tPrice) {

        System.out.println("City:" + city);
    }

DataProiver:

@DataProvider
    public Object[][] getData() {
        Object[][] data = null;

        String city = "Bilimora";
        String checkInDate = "checkInDate";
        String checkOutDate = "checkOutDate";
        String fHotel = "fHotel";
        String fPrice = "fPrice";
        String sHotel = "sHotel";
        String sPrice = "sPrice";
        String tHotel = "tHotel";
        String tPrice = "tPrice";
        data = new Object[][] { { city, checkInDate, checkOutDate, fHotel, fPrice, sHotel, sPrice, tHotel, tPrice } };
        return data;
    }

DataProvider with return type 2d array use for executing the same test number of time with different data.

To make it clear,

public class DP
{
 @DataProvider (name = "data-provider")
 public Object[][] dpMethod(){
 return new Object[][] {{"First-Value"}, {"Second-Value"}};
 }

    @Test (dataProvider = "data-provider")
    public void myTest (String val) {
        System.out.println("Passed Parameter Is : " + val);
    }
}

Output:

© www.soinside.com 2019 - 2024. All rights reserved.