首页 > 解决方案 > 是否可以在项目中只有 1 个 IAnnotationTransformer 实现

问题描述

我们可以在使用 TestNG 的项目中实现 1 个以上的 IAnnotationTransformer 吗?我正在使用 TestNg 7.0.0 版。

标签: javaannotationstestngtestng-annotation-test

解决方案


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);
    }
  }
}

推荐阅读