Ich schreibe eine Bibliothek, die auf der AbstractProcessor
Klasse basiert, da ich eine großartige Bibliothek schreiben möchte, möchte ich auch eine gute Berichterstattung haben. Da der Präprozessor zur Kompilierzeit arbeitet, bin ich mir nicht sicher, wie ich diesen Code testen soll.Testen von AbstractProcessor (Javas Annotationshandling zur Kompilierzeit)
Ich habe einige Testszenarien im Auge, wo der Build fehlschlagen sollte. Wie kann ich das testen? Muss ich Gradle ausführen und den Exit-Code prüfen? Gibt es eine saubere Möglichkeit zu überprüfen, ob der Build aufgrund einer erwarteten Ursache fehlschlägt, oder muss ich auch einen Parser schreiben? Das wäre IMHO ein riesiger Overhead nur für eine gute Abdeckung.
Für diejenigen von Ihnen, die ein Beispiel benötigen:
@SupportedAnnotationTypes("eu.rekisoft.java.preprocessor.Decorator")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class ExamplePreprocessor extends AbstractProcessor {
public ExamplePreprocessor() {
super();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for(Element elem : roundEnv.getElementsAnnotatedWith(Decorator.class)) {
Method method = Method.from((ExecutableElement)elem);
if(!method.matchesTypes(String.class, StringBuilder.class)) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "No! " + elem + " has the wrong args!");
} else {
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Yey " + elem + " this is fine!");
}
}
return true; // no further processing of this annotation type
}
}
Und hier ist eine Klasse, die kompiliert kann nicht:
public class AnnotationedExample {
@Decorator
public int breakBuild() {
return -1;
}
@Decorator
public String willCompile(StringBuilder sb) {
return null;
}
}
Und schließlich die langweilige Anmerkung:
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface Decorator {
}
Sie können auch das Projekt unter GitHub auschecken, Sie müssen nur das Projekt auschecken und 01 ausführen. Möglicherweise müssen Sie die fehlende x-Berechtigung für das Skript unter Linux und Mac beheben.
Bitte teilen Sie Ihren Code und die Testszenarien, die Sie bisher geschrieben haben. Was ist los mit ihnen? –
Frage mich nur, weißt du, wovon ich spreche? Es ist ein hochkomplexes Thema und wenn Sie damit vertraut sind, sollte das abstrakte Niveau meiner Frage in Ordnung sein. Ich kann jedoch ein Beispiel hinzufügen, wenn dies für Sie klarer wird. – rekire
@RobertColumbia hier ist ein einfaches Beispielprojekt, das nicht wie beabsichtigt kompilieren kann: https://github.com/rekire/AnnotationTesting Sie müssen nur das Projekt auschecken und 'grodlew cJ' ausführen, wenn Sie Linux verwenden, müssen Sie das reparieren fehlende x-Berechtigung des Skripts – rekire