4

我想测试我的实用程序类 ElementUtils,但我不知道如何将类作为元素。在 AnnotationProcessors 中,我使用以下代码获取我的元素

Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(annotation);

但由于 RoundEnvironment 在测试中不可用,这不是一个选项。

有没有办法将一个类作为 javax.lang.model.element.Element 获取?

4

2 回答 2

5

您可以使用 JUnit @Rule 在测试期间调用编译器运行,此时您可以使用 Types 和 Elements 实用程序类来获取 TypeMirror 和 Element 实例。

这样的规则已经创建并且是http://github.com/google/compile-testing的一部分,可以这样使用:

public @Rule CompilationRule rule = new CompilationRule();
private Elements elements;
private Types types;


@Before
public void setup() {
  elements = rule.getElements();
  types = rule.getTypes();
}

@Test void testStuff() {
  TypeElement typeElement = elements.getTypeElement("some.fully.qualified.ClassName");
  // do stuff.
}

可以在公共子模块的http://github.com/google/auto项目中找到一些您可以操作(无论是在测试中还是在其他方面)TypeMirror 和 Element 实例的东西,其中包含用于管理这些的实用程序java.lang.model 类方便。

于 2014-11-10T05:14:56.267 回答
1

Element实例仅在中间编译有效。equals()声明“元素的身份涉及隐式状态”的文档,在javac编译完成后实际上在实现中无效。因此,如果您试图保存对Element实例的引用并将它们与Element测试中的其他实例进行比较,那么它不会起作用。

也就是说,如果您将 a转换为 a ,您确实具有一定的灵活性。然后,您可以手动调用和阶段并使用从 .javax.tools.JavaCompiler.CompilationTaskcom.sun.source.util.JavacTaskparse()analyze()ElementElementsJavacTask.getElements()

于 2013-09-04T17:49:21.397 回答