Testng @返回类型为迭代器的数据提供程序<;对象[]>;

Testng @返回类型为迭代器的数据提供程序<;对象[]>;,testng,testng-dataprovider,testng-annotation-test,Testng,Testng Dataprovider,Testng Annotation Test,我尝试执行调用DATAsPvices的简单测试用例,这个数据提供者的返回类型为 Iterator < /代码>,我知道这种返回类型不接受 @ DATaValue方法,但是在执行下面的程序之后,我得到了空白输出,在CalBULL中没有显示任何内容。我接受至少像数据提供者不存在这样的消息,请参考下面的程序 public class Practice { @Test(dataProvider="NotWorking") public void t

我尝试执行调用DATAsPvices的简单测试用例,这个数据提供者的返回类型为<代码> Iterator < /代码>,我知道这种返回类型不接受<代码> @ DATaValue方法,但是在执行下面的程序之后,我得到了空白输出,在CalBULL中没有显示任何内容。我接受至少像数据提供者不存在这样的消息,请参考下面的程序

      public class Practice {


     @Test(dataProvider="NotWorking")
     public void testCase(Object[] obj)
      {
         System.out.println(obj[0]);
         System.out.println(obj[1]);
      }

@DataProvider(name="NotWorking")
public Iterator<Object[]> dataProvider2()
{
    List<Object[]> obj =new ArrayList<Object[]>();
    Object[] obj1=new Object[2];
    obj1[0]=new String("First_Object_First_value");
    obj1[1]=new String("First_Object_Second_value");
    Object[] obj2=new Object[2];
    obj2[0]=new String("Second_Object_First_value");
    obj1[1]=new String("Second_Object_Second_value");
    Iterator<Object[]> itr = obj.iterator();
    return itr;
       }
   }

这是因为
dataProviders
也接受
object[]
。您不能将其用于矩阵数据类型,但它受支持

所以如果你有这样的东西:

@DataProvider(name = "test1")
public Object[][] createData1() {
 return new Object[][] {
   { "Cedric", new Integer(36) },
   { "Anne", new Integer(37)},
 };
}
可以很容易地替换为

@DataProvider(name = "test1")
public Object[] createData1() {
 return new Object[] {
   { "Cedric"},
   { "Anne"},
 };
}
您的
obj
is有一个
对象的列表
数组
,您将返回
obj.iterator()

您的声明

dataProvider的返回类型为迭代器,我知道@dataProvider method`不接受此返回类型

这实际上是不正确的<代码>迭代器
是testNG中数据提供程序的可接受的返回类型

因此,上述代码的错误在于,您返回的是一个空的
迭代器
。 请注意以下代码中的更改:

@DataProvider(name=“NotWorking”)
公共迭代器dataProvider2()
{
List obj=new ArrayList();
对象[]obj1=新对象[2];
obj1[0]=新字符串(“第一个对象第一个值”);
obj1[1]=新字符串(“第一个对象第二个值”);
Object[]obj2=新对象[2];
obj2[0]=新字符串(“第二个对象第一个值”);
obj2[1]=新字符串(“第二个对象第二个值”);//键入错误。使用obj1代替obj2
//您没有添加以下两行
obj.add(obj1);
添加对象(obj2);
迭代器itr=obj.Iterator();
返回itr;
}
现在,在进行上述更改之后,您的测试将正常工作

注意:如果测试方法的数据为空,则不会调用该方法。

那么下一个问题-为什么测试被标记为ran,但没有打印任何内容。

答:这取决于testNG如何处理空迭代器。
版本
7.3.0
7.4.0
本身之间存在差异。对于
7.3.0
它将输出为
测试运行:0
,对于
7.4.0
它将输出为
测试运行:1
。作为
7.4.0
的一部分,日志记录中出现了代码更改。
7.4.0
的测试方法计数取自测试上下文
context.getAllTestMethods()
,其中包含正在运行的测试。对于
7.3.0
来说,它是从一个数组
m_allTestMethods
(它是空的)。

好的,谢谢你的回复,但是在testNg应该如何在控制台中给出一些消息,甚至不是执行测试用例,但它仍然说测试运行:1,为什么?@Ankuspawar:这是因为你返回了
obj.iterator()并且没有任何内容。您正在
obj1
obj2
中存储值,但未返回。好的,谢谢,请添加System.out.println(“测试用例”);这一行在测试方法和试着得到的输出你们得到的是相同的输出,但这里至少这一行得到了打印,但没有发生为什么?请帮忙this@ankushpawar:您为什么违反数据提供商原则?看看官员们对如何使用dataProviders@cruisepandey说了些什么,违反了哪个数据提供程序原则?DataProvider允许迭代器
Iterator是DataProvider可接受的返回类型-最终它是一个对象数组,而不是其他类型。为什么要让事情变得复杂?@cruisepandey在这个特定的问题中,返回类型是
迭代器还是
对象[][]
,并不重要。但是,当您不希望同时加载所有数据,或者希望测试方法接收特定对象而不是一组长参数时,迭代器非常有用<代码>迭代器
迭代器
可用于此。@cruisepandey对于简单的用例,只需返回
对象[]【】
。但需要注意的是,即使我们返回
Object[][]
testNG,它也会将其转换为
Iterator
。很好,您在github中打开了一个问题。发布链接以供任何人了解更新:
@DataProvider(name = "test1")
public Object[] createData1() {
 return new Object[] {
   { "Cedric"},
   { "Anne"},
 };
}