我们可以在使用 TestNG 的项目中实现 1 个以上的 IAnnotationTransformer 吗?我正在使用 TestNg 7.0.0 版。
问问题
83 次
1 回答
1
TestNG 目前只允许您连接一个IAnnotationTransformer
. 如果您尝试插入其中的多个,则添加的最后一个将被调用。
有一个未解决的问题正在跟踪这个问题。请参阅GITHUB-1894。
作为替代方案,您可以构建自己的复合材料,该复合材料IAnnotationTransformer
可用于迭代所有其他注释转换器实例。这是一个示例(可在上述 github 链接中找到)
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;
import org.testng.collections.Lists;
import org.testng.internal.ClassHelper;
public class CompositeTransformer implements IAnnotationTransformer {
private static final String JVM_ARGS =
"com.rationaleemotions.github.issue1894.Listener1, com.rationaleemotions.github.issue1894.Listener2";
private List<IAnnotationTransformer> transformers = Lists.newArrayList();
public CompositeTransformer() {
// Ideally this would get a value from the command line. But just for demo purposes
// I am hard-coding the values.
String listeners = System.getProperty("transformers", JVM_ARGS);
Arrays.stream(listeners.split(","))
.forEach(
each -> {
Class<?> clazz = ClassHelper.forName(each.trim());
IAnnotationTransformer transformer =
(IAnnotationTransformer) ClassHelper.newInstance(clazz);
transformers.add(transformer);
});
}
@Override
public void transform(
ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
for (IAnnotationTransformer each : transformers) {
each.transform(annotation, testClass, testConstructor, testMethod);
}
}
}
于 2019-09-29T04:54:21.890 回答