0

我在不同的类中有数据提供者,访问它是不同的 testng 类。我观察到,如果我不使用“静态”来返回它会抛出错误。我想知道这背后的逻辑是什么。请帮助我。

示例代码:

错误代码:

@DataProvider
public Object[][] testSumInput() {
return new Object[][] { { 5, 5 }, { 10, 10 }, { 20, 20 } };
}

正确代码:

@DataProvider
public static Object[][] testSumInput() {
return new Object[][] { { 5, 5 }, { 10, 10 }, { 20, 20 } };
}

创建数据提供者:

@DataProvider(name="dpProjectDetails")
    public static Object[][] supplyProjectDetails(){
        int noOfRows=CommonMethods.getRowCount(CommonMethods.XLPATH_PROJECT_DETAILS, CommonMethods.SHEET_PROJECT_DETAILS);
        int noOfCell=CommonMethods.getCellCount(CommonMethods.XLPATH_PROJECT_DETAILS, CommonMethods.SHEET_PROJECT_DETAILS);
        Object[][] projectDetails=new Object[noOfRows][noOfCell];


        for(int row=1;row<=noOfRows;row++){
            for(int cell=0;cell<noOfCell;cell++){
                projectDetails[row-1][cell]=CommonMethods.getExcelData(CommonMethods.XLPATH_PROJECT_DETAILS, CommonMethods.SHEET_PROJECT_DETAILS, row, cell);
            }
        }

        return projectDetails;
    }

}

--> 访问它:

@Test(dataProvider="DPCustomerData", dataProviderClass=TDCreateCustomer.class)
    public void createNewCustomer(String customerName,String custdescription){
        TDCreateCustomer tdCreateCustomer=new TDCreateCustomer();
        POCreateCustomer poCreateCustomer=new POCreateCustomer();

        tdCreateCustomer.setCustomerName(customerName);
        tdCreateCustomer.setDescription(custdescription);

        poCreateCustomer.createNewCustomer(tdCreateCustomer);
    }
4

4 回答 4

1

这意味着您正在尝试错误地访问它。您永远不应该尝试直接访问它,而应该使变量成为非静态和私有的,并且应该通过非静态公共方法间接访问它们,然后在类的实例上调用这些方法。

换句话说,您的大部分问题出在您没有向我们展示的代码中——您尝试“访问”数据的代码。

于 2013-10-07T07:07:30.213 回答
0

要访问另一个类的方法,要么必须创建一个类的对象,要么可以通过ClassName.methodName直接访问静态方法,如果是静态的,则很容易获取另一个类的方法。在这种方法中,无需创建整个类的对象,方法可以直接评估,仅用于相同目的

于 2015-12-28T15:15:24.873 回答
0

考虑根据TestNG的当前实现更新答案。

对于不同类中的数据提供者,静态方法不是强制性的。TestNG 文档提到:

默认情况下,将在当前测试类或其基类之一中查找数据提供者。如果要将数据提供者放在不同的类中,它需要是静态方法或具有非参数构造函数的类,并在 dataProviderClass 属性中指定可以找到它的类。

所以 dataprovider 方法,如果它在另一个类中,那么只有当数据提供者类没有默认构造函数时,它才需要是静态的。

前任:

以下两个将起作用:

public class MyDataProvider{
   // Java adds a no-arg constructor if there are no other constructors. Hence this works.
   @DataProvider
   public Object[][] dataSet1(){
      return new Object[][]{{1,"a"},{2,"b"}};
   }

public class MyDataProvider{

   public MyDataProvider(int a, String x){
      // do something.
   }

   // static method. Hence this works even though no-args constructor doesn't exist.
   @DataProvider
   public static Object[][] dataSet1(){
      return new Object[][]{{1,"a"},{2,"b"}};
   }

但是下面的代码将不起作用,因为没有无参数构造函数并且数据提供者方法不是静态的。因此,TestNG 无法

  1. 实例化数据提供者类对象
  2. 或以静态方式调用数据提供者方法。
public class MyDataProvider{

   public MyDataProvider(int a, String x){
      // do something.
   }
   @DataProvider
   public Object[][] dataSet1(){
      return new Object[][]{{1,"a"},{2,"b"}};
   }
于 2020-09-17T12:43:43.373 回答
0

这两个答案对我来说似乎并不完全令人满意)。

1)TestNG 显然依赖于反射。所以我不认为“ClassName.methodName”真的发生在那里。

2)然而,访问类的公共静态方法确实比访问非静态方法简单得多。后者需要先创建该类的实例。在谈论反射时,创建任意类的实例可能非常棘手。

3)毕竟,一般的单元测试概念(如果我理解正确的话)是测试用例应该是可重现的。因此它们不应该(在大多数情况下)依赖于实例变量,从这个角度来看,静态数据提供者是非常自然的。

4) 顺便提一下:当 dataProvider 驻留在同一个类中时,这意味着 TestNG 已经有一个实例在手边,所以它可以是非静态的。

于 2016-05-29T00:11:00.107 回答