是否有可能在一个项目中只有 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);
    }
  }
}