是否有可能在一个项目中只有 1 个 IAnnotationTransformer 的实现
Is it possible to have only 1 implementation of IAnnotationTransformer in a project
我们可以在使用 TestNG 的项目中实现 1 个以上的 IAnnotationTransformer 吗?
我正在使用 TestNg 版本 7.0.0.
TestNG 目前只允许您连接 IAnnotationTransformer
的一个实现。如果您尝试插入其中的多个,最后添加的将被调用。
有一个未解决的问题正在跟踪此问题。参见 GITHUB-1894。
作为替代方案,您可以构建自己的组合 IAnnotationTransformer
,它可用于遍历所有其他注释转换器实例。这是一个示例(在上面提到的 github link 中可用)
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);
}
}
}
我们可以在使用 TestNG 的项目中实现 1 个以上的 IAnnotationTransformer 吗? 我正在使用 TestNg 版本 7.0.0.
TestNG 目前只允许您连接 IAnnotationTransformer
的一个实现。如果您尝试插入其中的多个,最后添加的将被调用。
有一个未解决的问题正在跟踪此问题。参见 GITHUB-1894。
作为替代方案,您可以构建自己的组合 IAnnotationTransformer
,它可用于遍历所有其他注释转换器实例。这是一个示例(在上面提到的 github link 中可用)
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);
}
}
}