Bạn đang mô phỏng đúng API xử lý chú thích (với thư viện mô phỏng như easymock) rất đau. Tôi đã thử cách tiếp cận này và nó đã phá vỡ khá nhanh chóng. Bạn phải thiết lập cho nhiều kỳ vọng cuộc gọi phương thức. Các bài kiểm tra trở nên không thể duy trì được.
A phương pháp thử nghiệm dựa trên trạng thái đã làm việc cho tôi một cách hợp lý. Tôi đã phải thực hiện các phần của javax.lang.model.* API I needed for my tests. (Đó chỉ là < 350 dòng mã.)
Đây là một phần của thử nghiệm để khởi tạo các đối tượng javax.lang.model. Sau khi thiết lập mô hình phải ở trong trạng thái giống như việc thực hiện trình biên dịch Java.
DeclaredType typeArgument = declaredType(classElement("returnTypeName"));
DeclaredType validReturnType = declaredType(interfaceElement(GENERATOR_TYPE_NAME), typeArgument);
TypeParameterElement typeParameter = typeParameterElement();
ExecutableElement methodExecutableElement = Model.methodExecutableElement(name, validReturnType, typeParameter);
Phương thức nhà máy tĩnh được xác định trong lớp Model
triển khai lớp javax.lang.model. *. Ví dụ: declaredType
. (Tất cả các hoạt động không được hỗ trợ sẽ ném ngoại lệ.)
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(); }
};
}
Phần còn lại của bài kiểm tra xác minh hành vi của lớp đang được kiểm tra.
Method actual = new Method(environment(), methodExecutableElement);
Method expected = new Method(..);
assertEquals(expected, actual);
Bạn có thể xem source code of the Quickcheck @Samples and @Iterables source code generator tests. (Mã này không tối ưu. Lớp Method có nhiều tham số và lớp Parameter không được kiểm tra trong bài kiểm tra riêng của nó nhưng là một phần của bài kiểm tra Method. Tuy nhiên, nó vẫn minh họa cách tiếp cận này.)
Viel Glück!