4

ユーティリティクラスElementUtilsをテストしたいのですが、クラスをElementとして取得する方法がわかりません。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.
}

TypeMirrorインスタンスとElementインスタンスを操作するために実行できる操作の一部は、共通のサブモジュールのhttp://github.com/google/autoプロジェクトにあります。このプロジェクトには、これらを管理するためのユーティリティが含まれています。 java.lang.modelクラスが便利です。

于 2014-11-10T05:14:56.267 に答える
1

Elementインスタンスはコンパイルの途中でのみ有効です。equals()「要素のIDには暗黙の状態が含まれる」という状態のドキュメントjavac。実装では、コンパイルが完了すると実際には無効になります。したがって、インスタンスへの参照を保持し、それらをテストでElement他のインスタンスと比較しようとしているElement場合、それは機能しません。

とはいえ、をにキャストすると、ある程度の柔軟性があります。次に、とフェーズを手動で呼び出し、から返され たインスタンスを使用してインスタンスを取得できます。javax.tools.JavaCompiler.CompilationTaskcom.sun.source.util.JavacTaskparse()analyze()ElementElementsJavacTask.getElements()

于 2013-09-04T17:49:21.397 に答える