0

Can you please let me know if we can merge the below 2 dataproviders

public Object[][] dp1() {
   User user = new User(1L, "Arun");
   Transaction trx = new Transaction(1L, "atm");   
  return new Object[][] {
      new Object[] { user , trx, true  }

  };
}

public Object[][] dp2() {
  return new Object[][] {
      new Object[] { "e", "f" }
  };
}

I want to merge them horizontally, after merge the following output is desired in the merged dataprovider { user , trx, true, "e", "f" }

Tarun Gupta
  • 107
  • 3
  • 16

3 Answers3

1

I dont think testng allows you two call two diff dataproviders. But you can write a new data provider in which you can call these methods and perform the required merging operation for each row of the array object they return. And make this method as the data provider for your tests.

public method mergeData(){
variable a [][]= dp1();
variable b [][]= dp2();

//perform required merging and store it in an object array and return it.
}
Shamik
  • 1,591
  • 2
  • 16
  • 36
0

there is no way to set multiple data provider in testNG, so i am using a utility method to merge as below.

@DataProvider(name = "myDataProvider")
public Object[][] myDataProvider() {
    return mergeDataProviders(myDataProvider1(),myDataProvider2());
}

@DataProvider(name = "myDataProvider1")
public Object[][] myDataProvider1() {
    return new Object[][]{};
}

@DataProvider(name = "myDataProvider2")
public Object[][] myDataProvider2() {
    return new Object[][]{};
}

private static  Object[][]  mergeDataProviders(Object[][] ... dataProviders) {
    return Arrays.stream(args)
            .map(Arrays::asList)
            .flatMap(List::stream).toArray(Object[][]::new);
}
swaz
  • 321
  • 2
  • 5
0

You can combine two into one and can repeat as much as you need

public static Object[][] dp1AndDp2() {
        return mergeData(dp1(), dp1());
}
private static Object[][] mergeData(Object[][] list1, Object[][] list2) {
        int d1Size = list1.length * list2.length;
        int d2Size = list1[0].length + list2[0].length;

        Object[][] ret1 = new Object[d1Size][d2Size];
        int d1Index = 0;
        int d2Index = 0;
        for (Object[] item1 : list1) {
            for (Object[] item2 : list2) {
                for (Object o1 : item1) {
                    ret1[d1Index][d2Index] = o1;
                    d2Index++;
                }
                for (Object o2 : item2) {
                    ret1[d1Index][d2Index] = o2;
                    d2Index++;
                }
                d1Index++;
                d2Index = 0;
            }
        }
        return ret1;
    }