在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
实例。