3. You need an annotation transformer to get the job done.
Code :
package org.rationale.emotions.testng;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.DataProvider;
import org.testng.annotations.ITestAnnotation;
import org.testng.annotations.Test;
public class ParameterizedDataProvider {
@Test(dataProvider = "dates")
public void f(Object data) {
if (data instanceof MyDate) {
System.out.println("Printing date");
System.out.println(((MyDate) data).getDateInformationToPrint());
}
if (data instanceof Student) {
System.out.println("Printing student information");
System.out.println(((Student) data).getStudentInformation());
}
}
@DataProvider(name = "dates")
public Object[][] dp() {
return new Object[][] { { new MyDate(1, 1, 2011) }, { new MyDate(1, 1, 1989) } };
}
@DataProvider(name = "students")
public Object[][] anotherdp() {
return new Object[][] { { new Student("Bob", 1) }, { new Student("Jimmy", 2) } };
}
public static class MyDate {
private int day, month, year;
public MyDate(int day, int month, int year) {
this.day = day;
this.month = month;
this.year = year;
}
public String getDateInformationToPrint() {
return day + "-" + month + "-" + year;
}
}
public static class Student {
private String name;
private int rollNumber;
public Student(String name, int rollNumber) {
this.rollNumber = rollNumber;
}
public String getStudentInformation() {
return name + "," + rollNumber;
}
}
public static class MyParser implements IAnnotationTransformer {
@SuppressWarnings("rawtypes")
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor,
Method testMethod) {
System.out.println("Invoked");
String dataProviderName = System.getProperty("dp");
System.out.println("Data Provider Name " + dataProviderName);
if (dataProviderName == null || dataProviderName.trim().isEmpty()) {
return;
}
annotation.setDataProvider(dataProviderName);
}
}
}
Suite XML File:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<listeners>
<listener
class-name="org.rationale.emotions.testng.ParameterizedDataProvider$MyParser" />
</listeners>
<test name="Test" verbose="2">
<classes>
<class name="org.rationale.emotions.testng.ParameterizedDataProvider" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
mvn test -DtestSuite=parameterizedDataProvider.xml [ Using the default data provider]
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
Invoked
Data Provider Name null
Printing date
1-1-2011
Printing date
1-1-1989
PASSED: f(org.rationale.emotions.testng.ParameterizedDataProvider$MyDate@255e4373)
PASSED: f(org.rationale.emotions.testng.ParameterizedDataProvider$MyDate@4f9e462f)
===============================================
Test
Tests run: 2, Failures: 0, Skips: 0
===============================================
mvn test -DtestSuite=parameterizedDataProvider.xml -Ddp=students [ Changing the data provider via JVM arguments]
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
Invoked
Data Provider Name students
Printing student information
Bob,1
Printing student information
Jimmy,2
PASSED: f(org.rationale.emotions.testng.ParameterizedDataProvider$Student@2011e07f)
PASSED: f(org.rationale.emotions.testng.ParameterizedDataProvider$Student@75a9c24b)
===============================================
Test
Tests run: 2, Failures: 0, Skips: 0
===============================================