如何在 POJO 中存储 TestNG 数据提供程序值 class

How to store the TestNG dataprovider values in a POJO class

我有一个 excel sheet,它有两列,如下所示:

我使用@Dataprovider(TestNG 注释)从excel sheet 读取数据并将其传递给@Test 方法。测试方法如下所示

@Test(dataProvider = "testautomation")
    public void getData(String userName, String password)throws Exception 
      {
        System.out.println(userName+ "\t ****");
        System.out.println(password);
      }

它按预期工作,并从 excel sheet 获得了正确的数据。但是有什么办法可以将这两个参数保留在 pojo class 中并在 @test 方法中传递 class 对象?顺便说一句,我可以停止公开参数,例如(@Test 方法中的用户名、密码)。

可能是 pojo class 如下所示:

public class DatObject
 {
    private String userName;
    private String password;

    //and getter setter methods.
 }

测试方法如下所示:

@Test(dataProvider = "testautomation")
        public void getData(DataObject dataObj)throws Exception 
          {

            System.out.println(dataObj.getUserName()+ "\t ****");
            System.out.println(dataObj.getPasswrod());
          }

我想调用这个 pojo class 对象作为@test 方法中的参数,并使用 pojo class 中的 getter 和 setter 方法来获取值在@Test 方法中传递用户名和密码。

有线索吗?

您的数据提供者方法应该return pojos:

@DataProvider(name = "pojoProvider")
public Object[][] createPojoData() {
 return new Object[][] {
   { new DataObject("User1", "****") },
   { new DataObject("User2", "****") },
 };
}

然后在测试注解中指定即可:

@Test(dataProvider = "pojoProvider")
public void getData(DataObject dataObj)throws Exception 
{
    System.out.println(dataObj.getUserName()+ "\t ****");
    System.out.println(dataObj.getPasswrod());
}

你可以完全摆脱 POJO,想象一下你有多种类型的 POJO,你会为每个 POJO 创建一个数据提供者吗?当然不是,所以你可以像这样在你的测试方法中使用 Map:

@Test(dataProvider = "dataProviderName")
void testGetUserDataAsPojo(Map user) {
    System.out.println("Name: " + (String)user.get("Name") );
}

这更加通用,您可以控制拥有哪些类型的字段i.g。 'Name' 字段

注意:您的数据提供者方法应该return Iterator<Object>数据类型

其他解决方案对我不起作用,但这个解决方案:

假设您从 DataProvider 传递了 4 个参数:givenName、familyName、age、gender。 将助手 class 定义为:

public class UserDetails {
private String givenName;
private String familyName;
private String age;
private String gender;//and getter setter methods for all 4 param
}

如下定义DataProvider:

@DataProvider
public static Iterator<Object[]> getDataForUser() throws Exception {
    Object[][] testObjArray = {{ "Monika", "Jain", "30", "Female"},{ "Krishna", "Verma", "28" , "Male"}}; //You can pick this data from an excel here
    return getUserDetails(testObjArray);

}

private static Iterator<Object[]> getUserDetails(final Object[][] objArr) {
    List<UserDetails> testList = new ArrayList<>();
    for(Object[] arr : objArr) {
        UserDetails user = new UserDetails();
        user.setGivenName(arr[0].toString());
        user.setFamilyName(arr[1].toString());
        user.setAge(arr[2].toString());
        user.setGender(arr[3].toString());
        
        testList.add(user);
    }
    Collection<Object[]> dp = new ArrayList<Object[]>();
    for(UserDetails userDetails : testList){
        dp.add(new Object[]{userDetails});
    }
    return dp.iterator();
}

现在定义测试方法如下:

@Test(dataProvider = "getDataForUser")
public void displayUserDetails(final UserDetails userDetails) throws InterruptedException {

    System.out.println("Given Name is:"+ userDetails.getGivenName());
    System.out.println("Family Name is:"+ userDetails.getFamilyName());
    System.out.println("Age is:"+ userDetails.getAge());
    System.out.println("Gender is:"+ userDetails.getGender());
    
}