在junit测试中获取一个类作为javax.lang.model.element.Element

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

Set elements = roundEnvironment.getElementsAnnotatedWith(annotation); 

但由于RoundEnvironment在测试中不可用,因此不能选择。

有没有办法将类作为javax.lang.model.element.Element?

您可以使用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类很方便。

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

也就是说,如果将javax.tools.JavaCompiler.CompilationTask转换为com.sun.source.util.JavacTask ,则确实具有一定的灵活性。 然后,您可以手动调用parse()analyze()阶段,并使用从JavacTask.getElements()返回的Elements实例获取Element实例。