Given my data CSV file:
jones;1293039,
smith;2938949,
johnson;1203939,
clark;8293044
And my DataProvider:
@DataProvider(name="data")
public Iterator<Object[]> custDataProvider(){
try{
Scanner scanner = new Scanner(new File(CSV_FILE)).useDelimiter(DELIMITER);
return new Iterator<Object[]>() {
@Override
public boolean hasNext() {
return scanner.hasNext();
}
@Override
public Object[] next() {
return new Object[]{scanner.next().split(";")[0]};
}
};
}catch(FileNotFoundException e){
e.printStackTrace();
return null;
}
}
I can iterate over the data values based on the index of the array, splitting on the ;
So, the below method will print the name
attribute at index 0:
@Test(dataProvider = "data")
public void createNewCustomer(String name) {
System.out.println(name);
}
And if I change the array index to [1]
it will print the customer number. But I wonder if I can parameterize the DataProvider
method with an int index
like so:-
@DataProvider(name="data")
public Iterator<Object[]> custDataProvider(int index){
try{
Scanner scanner = new Scanner(new File(CSV_FILE)).useDelimiter(DELIMITER);
return new Iterator<Object[]>() {
@Override
public boolean hasNext() {
return scanner.hasNext();
}
@Override
public Object[] next() {
return new Object[]{scanner.next().split(";")[index]};
}
};
}catch(FileNotFoundException e){
e.printStackTrace();
return null;
}
}
And call based on whether I want the customer name or number like so:-
@Test(dataProvider = "data")
public void createNewCustomer(String name) {
String customerName = custDataProvider(0);
System.out.println(name);
}
@Test(dataProvider = "data")
public void createNewCustomer(String number) {
String customerNumber = custDataProvider(1);
System.out.println(number);
}
The behavior I'm seeing is that it skips the tests entirely.