我正在编写一个库,它依赖于AbstractProcessor
类,因为我想写一个伟大的库,我希望它有很好的覆盖率。由于预处理器在编译时工作,我不知道如何测试该代码。测试AbstractProcessor(Java在编译时的注解处理)
我有一些测试场景记住构建应该失败的地方。但是,我如何测试?我必须执行gradle并检查退出代码吗?有没有一种简洁的方法来验证由于预期的原因导致构建失败还是需要编写某种解析器?这将是恕我直言,一个巨大的开销,只是为了覆盖面很好。
对于那些这就需要一个例子:
@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
}
}
这里是不能被编译的类:
public class AnnotationedExample {
@Decorator
public int breakBuild() {
return -1;
}
@Decorator
public String willCompile(StringBuilder sb) {
return null;
}
}
最后无聊注释:
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface Decorator {
}
您也可以在GitHub结帐该项目,您只需检出项目并执行gradlew cJ
。您可能需要在Linux和Mac上修复脚本上缺少的x权限。
请分享您的代码和目前为止编写的测试场景。他们怎么了? –
只是想知道你知道我在说什么吗?这是一个高度复杂的话题,如果你熟悉它,我的问题的抽象层次应该没问题。不过,如果这使得它更清晰,我可以添加一个示例。 – rekire
@RobertColumbia这里是一个简单的示例项目,它不能按预期进行编译:https://github.com/rekire/AnnotationTesting你只需要检查项目并执行'gradlew cJ',如果你使用linux,你必须修复缺少脚本的x权限。 – rekire