Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TestNG中作为@DataProvider的自定义类数组_Java_Selenium_Testng - Fatal编程技术网

Java TestNG中作为@DataProvider的自定义类数组

Java TestNG中作为@DataProvider的自定义类数组,java,selenium,testng,Java,Selenium,Testng,我想知道是否有办法将@Test方法的所有参数打包成一个类Name,并提供Name[]作为@DataProvider public class FirstTestClass { @Test (dataProvider = "getNames") public void test01(Name name) { System.out.println(name.name + " " + name.id); } @DataProvider public Name[] getN

我想知道是否有办法将
@Test
方法的所有参数打包成一个类
Name
,并提供
Name[]
作为
@DataProvider

public class FirstTestClass {

  @Test (dataProvider = "getNames")
  public void test01(Name name) {
    System.out.println(name.name + " " + name.id);
  }
  @DataProvider
  public Name[] getNames() {
      Name[] result = new Name[2];
      result[0] = new Name("john", 5);
      result[1] = new Name("doe", 4);
      return result;
  }
}

class Name {
    public String name;
    public Integer id;
    public Name(String name, Integer id) {
        this.name = name;
        this.id = id;
   }
}
测试被跳过,我收到一条消息说
必须返回Object[]]或Iterator[]
。这是有限的,对吧?对此有解决方法吗?

将其更改为

@DataProvider
public Name[][] getNames() {
   Name[][] result = new Name[2][];
   result[0] = {new Name("john", 5)};
   result[1] = {new Name("doe", 4)};
   return result;
}

我不知道为什么使用专用类来保存所有属性,但是你应该考虑一些类似的东西:

public class FirstTestClass {

  @Test(dataProvider = "getNames")
  public void test01(String name, Integer id) {
    System.out.println(name + " " + id);
  }

  @DataProvider
  public Object[][] getNames() {
    return new Object[][] {
      new Object[] { "john", 5 },
      new Object[] { "doe", 4 }
    }
  }
}

在JUnit4.x中,以下是实现上述场景的方法

@RunWith(Parameterized.class)
public class FirstTest {
    private LoginCredentials loginData;

    public FirstTest(LoginCredentials testData) {
        loginData = testData;
    }

@Parameterized.Parameters
public static LoginCredentials[] generateTestData() {
    return ReadingExcelSheets.generateTestData();
}

我希望TestNG中有类似的东西,有人告诉我,它比JUnit更灵活、更强大。事实证明,我们在@DataProvider方法中只返回了Object[][]。

我现在理解了您的问题,您需要以下的TestNG翻译:

@RunWith(Parameterized.class)
public class FirstTest {
    private LoginCredentials loginData;

    public FirstTest(LoginCredentials testData) {
        loginData = testData;
    }

    @Parameterized.Parameters
    public static LoginCredentials[] generateTestData() {
        return ReadingExcelSheets.generateTestData();
    }
}
解决办法可以是:

public class FirstTest {

    private final LoginCredentials loginData;

    @Factory(dataprovider = "generateTestData")
    public FirstTest(LoginCredentials testData) {
        loginData = testData;
    }

    @Test
    public void test01() {
        System.out.println(loginData);
    }

    @DataProvider
    public static Object[][] generateTestData() {
        return convert(ReadingExcelSheets.generateTestData());
    }

    public static Object[][] convert(LoginCredentials[] values) {
        Object[][] result = new Object[values.length];
        for (int i=0; i<result.length; i++) {
            result[i] = new Object[]{ values[i] };
        }
        return result;
    }
}
公共类FirstTest{
私人最终登录补充登录数据;
@工厂(dataprovider=“generateTestData”)
公共首次测试(LoginCredentials测试数据){
loginData=测试数据;
}
@试验
公共无效测试01(){
系统输出打印LN(登录数据);
}
@数据提供者
公共静态对象[][]generateTestData(){
返回convert(ReadingExcelSheets.generateTestData());
}
公共静态对象[][]转换(LoginCredentials[]值){
对象[][]结果=新对象[values.length];

对于(int i=0;i为什么不能使用只有一列的二维数组来做同样的事情。您有什么具体的要求吗?类似这样的要求

@Test(dataProvider = "getNames")
public void test01(Name name) {
    System.out.println(name.name + " " + name.id);
}

@DataProvider
public Object[][] getNames() {
    Name[][] result = new Name[2][1];
    result[0][0] = new Name("john", 5);
    result[1][0] = new Name("doe", 4);
    return result;
}

我用我建议的更改测试了您的代码。

在我看来,这是非常有限的…JUnit有参数化方法,这些方法接受自定义类数组作为数据提供程序…假设我想测试从DB自动填充表单…返回的表行将有这么多字段…方法签名不能包含所有变量都正确吗?TestNG在这方面非常有限……我不理解你的观点。你能分享一下你的junit方法吗?
@RunWith(Parameterized.class)public class FirstTest{private LoginCredentials loginda;public FirstTest(LoginCredentials testData){loginda=testData;}@Parameterized.Parameters公共静态LoginCredentials[]generateTestData(){返回ReadingExcelSheets.generateTestData();}
@Julienin我的观点非常有限……JUnit具有参数化方法,这些方法接受自定义类数组作为数据提供程序……假设我想测试从DB自动填充表单……返回的表行将有这么多字段……方法签名不能包含所有变量,对吗?TestNG在这方面非常有限aspect…@ChandrachudNanduri如果你喜欢JUnit,你应该使用它。但是这里你有相同的自定义类,只包装在数组中,我不认为这有什么大不了的。我刚刚打开了一个项目的相关问题:okie…这是一个解决方法,但不是理想的解决方案…我觉得如果JUnit 4.x支持Object[],那么TestNG也应该如此,它是一个高级且更灵活的框架:)
@Test(dataProvider = "getNames")
public void test01(Name name) {
    System.out.println(name.name + " " + name.id);
}

@DataProvider
public Object[][] getNames() {
    Name[][] result = new Name[2][1];
    result[0][0] = new Name("john", 5);
    result[1][0] = new Name("doe", 4);
    return result;
}