我正在尝试使用Java注释处理器。我可以使用“ JavaCompiler”编写集成测试(实际上,我目前正在使用“ Hickory”)。我可以运行编译过程并分析输出。问题:即使我的注释处理器中没有任何代码,单个测试也会运行约半秒钟。以TDD样式使用它太长了。
对我而言,模拟依赖项非常困难(我将不得不模拟整个“ javax.lang.model.element”包)。有人成功编写了注释处理器(Java 6)的单元测试吗?如果没有,您将采取什么方法?
您正确地模拟了注释处理API(使用像easymock这样的模拟库)是很痛苦的。我尝试了这种方法,但很快就崩溃了。您必须设置许多方法调用期望。测试变得不可维护。
一个 基于状态的测试方法 为我工作得非常好。我必须实现测试所需的javax.lang.model。* API的各个部分。(只有不到350行代码。)
这是初始化javax.lang.model对象的测试的一部分。设置完成后,模型应与Java编译器实现处于相同状态。
DeclaredType typeArgument = declaredType(classElement("returnTypeName")); DeclaredType validReturnType = declaredType(interfaceElement(GENERATOR_TYPE_NAME), typeArgument); TypeParameterElement typeParameter = typeParameterElement(); ExecutableElement methodExecutableElement = Model.methodExecutableElement(name, validReturnType, typeParameter);
静态工厂方法在Model实现javax.lang.model。*类的类中定义。例如declaredType。(所有不受支持的操作都将引发异常。)
Model
declaredType
public static DeclaredType declaredType(final Element element, final TypeMirror... argumentTypes) { return new DeclaredType(){ @Override public Element asElement() { return element; } @Override public List<? extends TypeMirror> getTypeArguments() { return Arrays.asList(argumentTypes); } @Override public String toString() { return format("DeclareTypeModel[element=%s, argumentTypes=%s]", element, Arrays.toString(argumentTypes)); } @Override public <R, P> R accept(TypeVisitor<R, P> v, P p) { return v.visitDeclared(this, p); } @Override public boolean equals(Object obj) { throw new UnsupportedOperationException(); } @Override public int hashCode() { throw new UnsupportedOperationException(); } @Override public TypeKind getKind() { throw new UnsupportedOperationException(); } @Override public TypeMirror getEnclosingType() { throw new UnsupportedOperationException(); } }; }
测试的其余部分将验证被测类的行为。
Method actual = new Method(environment(), methodExecutableElement); Method expected = new Method(..); assertEquals(expected, actual);
您可以查看Quickcheck @Samples和@Iterables源代码生成器测试的源代码。(代码仍然不是最佳的。Method类具有许多参数,而Parameter类并未在其自己的测试中进行测试,而是作为Method测试的一部分进行测试的。尽管如此,它仍应说明该方法。)
VielGlück!