gpt4 book ai didi

java - 测试 AbstractProcessor(Java 在编译时的注解处理)

转载 作者:行者123 更新时间:2023-11-30 08:00:08 25 4
gpt4 key购买 nike

我正在编写一个依赖于 AbstractProcessor 类的库,因为我想编写一个很棒的库,所以我也希望有一个很好的覆盖范围。由于预处理器 在编译时工作,我不确定如何测试该代码。

我有一些构建应该失败的测试场景。但是我该如何测试呢?我是否必须执行 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 处 checkout 项目你只需要 checkout 项目并执行 gradlew cJ。您可能需要修复 linux 和 mac 上脚本缺少的 x 权限。

最佳答案

Google 有一个非常好的 API 用于测试编译。 (https://github.com/google/compile-testing)。下面是一个示例,用于测试 .java 文件是否可以通过使用 junit 的处理器进行编译。

package org.coffeebag.processor;

import com.google.testing.compile.JavaFileObjects;
import com.google.testing.compile.JavaSourceSubjectFactory;
import org.junit.Test;

import java.io.File;
import java.net.MalformedURLException;

import static org.truth0.Truth.ASSERT;

public class ExampleTest {

@Test
public void EmptyClassCompiles() throws MalformedURLException {
final MyProcessor processor = MyProcessor.testMode();
File source = new File("path/to/test/file.java");
ASSERT.about(JavaSourceSubjectFactory.javaSource())
.that(JavaFileObjects.forResource(source.toURI().toURL()))
.processedWith(processor)
.compilesWithoutError();
}
}

关于java - 测试 AbstractProcessor(Java 在编译时的注解处理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38753986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com