आप एनोटेशन प्रोसेसिंग एपीआई (मॉक लाइब्रेरी जैसे आसान मॉक के साथ) का मज़ाक उड़ा रहे हैं दर्दनाक है। मैंने इस दृष्टिकोण की कोशिश की और यह बहुत तेजी से टूट गया। आपको कई विधि कॉल अपेक्षाओं को सेटअप करना होगा। परीक्षण अनजान हो जाते हैं।
ए राज्य-आधारित परीक्षण दृष्टिकोण मेरे लिए काफी अच्छा काम करता है। मुझे javax.lang.model.* API I needed for my tests के हिस्सों को लागू करना पड़ा। (यह केवल < कोड की 350 लाइनें थीं।)
यह javax.lang.model ऑब्जेक्ट्स को शुरू करने के लिए एक परीक्षण का हिस्सा है। सेटअप के बाद मॉडल जावा कंपाइलर कार्यान्वयन के समान राज्य में होना चाहिए।
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
। (सभी असमर्थित आपरेशन अपवाद फेंक देते हैं।)
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);
आप source code of the Quickcheck @Samples and @Iterables source code generator tests पर एक नज़र डाल सकते हैं। (कोड इष्टतम नहीं है। विधि वर्ग में कई पैरामीटर हैं और पैरामीटर वर्ग का परीक्षण अपने परीक्षण में नहीं किया जाता है, लेकिन विधि परीक्षण के हिस्से के रूप में। इसे फिर भी दृष्टिकोण को स्पष्ट करना चाहिए।)
वीएल ग्लूक!