你嘲笑注释处理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);
静态工厂方法在实现 javax.lang.model.* 类的类中定义。例如。(所有不受支持的操作都将引发异常。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源代码生成器测试。(代码还不是最佳的。方法类具有许多参数,并且 Parameter 类不是在其自己的测试中进行测试,而是作为方法测试的一部分进行测试。尽管如此,它应该说明该方法。
维尔·格吕克!