这可能是一个很晚的答案,但仍在发布。
下面的示例展示了如何使用 TestNG 来完成。我正在使用 TestNG 7.0.0-beta1
(截至今天的最新发布版本)。
场景 1:数据提供者位于同一个类中。
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(DataProviderTrackingListener.class)
public class DataProviderInSameClass {
@Test(dataProvider = "dp")
public void testMethod(int i) {
System.err.println(i);
}
@DataProvider(name = "dp")
public Object[][] getData() {
return new Object[][] {{1}, {2}};
}
}
场景 2:数据提供者驻留在基类中。
import org.testng.annotations.DataProvider;
public class BaseClass {
@DataProvider(name = "dp")
public Object[][] getData() {
return new Object[][] {{1}, {2}};
}
}
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(DataProviderTrackingListener.class)
public class DataProviderInBaseClass extends BaseClass {
@Test(dataProvider = "dp")
public void testMethod(int i) {
System.err.println(i);
}
}
场景 3:数据提供者位于完全不同的类中。
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(DataProviderTrackingListener.class)
public class DataProviderInDifferentClass {
@Test(dataProvider = "dp", dataProviderClass = BaseClass.class)
public void testMethod(int i) {
System.err.println(i);
}
}
提取所有这些信息并将其显示给您的侦听器
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Optional;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderTrackingListener implements ITestListener {
@Override
public void onTestStart(ITestResult result) {
Test test = result.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class);
if (test == null) {
return;
}
Method method = null;
Class<?> foundInClass = null;
if (isDataProviderPresentInDifferentClass(test)) {
method = extractDataProviderMethodFrom(test.dataProviderClass());
foundInClass = test.dataProviderClass();
} else {
Class<?> currentClass = result.getInstance().getClass();
while (currentClass != Object.class) {
Optional<Method> methods =
Arrays.stream(currentClass.getDeclaredMethods())
.filter(
eachMethod -> {
DataProvider dataProvider = eachMethod.getAnnotation(DataProvider.class);
return (dataProvider != null
&& dataProvider.name().equals(test.dataProvider()));
})
.findFirst();
if (methods.isPresent()) {
method = methods.get();
foundInClass = currentClass;
break;
}
currentClass = currentClass.getSuperclass();
}
}
if (method != null) {
String msg =
String.format(
"Data provider [%s] found in class [%s]", method.getName(), foundInClass.getName());
System.err.println(msg);
}
}
private static boolean isDataProviderPresentInDifferentClass(Test test) {
return test.dataProviderClass() != Object.class;
}
private static Method extractDataProviderMethodFrom(Class<?> clazz) {
Optional<Method> method =
Arrays.stream(clazz.getMethods())
.filter(eachMethod -> eachMethod.getAnnotation(DataProvider.class) != null)
.findFirst();
return method.orElse(null);
}
}