मैं एक POJO कि कुछ करने के लिए एक सेवा का उपयोग करता है अधिलेखित करने के लिए ग्रूवी MetaClass का उपयोग करना:तरीके
public class PlainOldJavaObject {
private IService service;
public String publicMethod(String x) {
return doCallService(x);
}
public String doCallService(String x) {
if(service == null) {
throw new RuntimeException("Service must not be null");
}
return service.callX(x);
}
public interface IService {
String callX(Object o);
}
}
और मैं एक ग्रूवी परीक्षण का मामला है:
class GTest extends GroovyTestCase {
def testInjectedMockIFace() {
def pojo = new PlainOldJavaObject(service: { callX: "very groovy" } as IService)
assert "very groovy" == pojo.publicMethod("arg")
}
def testMetaClass() {
def pojo = new PlainOldJavaObject()
pojo.metaClass.doCallService = { String s ->
"no service"
}
assert "no service" == pojo.publicMethod("arg")
}
}
पहला परीक्षण विधि, testInjectedMockIFace
काम करता है जैसा कि अपेक्षित था: पीओजेओ IService
के गतिशील कार्यान्वयन के साथ बनाया गया है। जब callX
का आह्वान किया जाता है, तो यह बस "बहुत गड़बड़" देता है। इस तरह, सेवा का मज़ाक उड़ाया जाता है।
हालांकि मुझे समझ नहीं आता क्यों दूसरी विधि, testMetaClass
अपेक्षा के अनुरूप काम नहीं कर रहा है लेकिन इसके बजाय एक NullPointerException जब सेवा वस्तु पर callX
आह्वान करने के लिए कोशिश कर फेंकता है। मैंने सोचा कि मैं इस लाइन के साथ doCallService
विधि ओवरराइट किया था:
pojo.metaClass.doCallService = { String s ->
क्या मैं गलत कर रहा हूँ?
धन्यवाद!
यहां ध्यान रखने योग्य एक बात यह है कि जब आप कक्षा के मेटा क्लास में हेरफेर करते हैं, तो उस बिंदु से आगे की प्रत्येक घटना का उपयोग किया जाएगा। यह उसी सत्र में चलने वाले अन्य परीक्षणों पर एक बड़ा प्रभाव डाल सकता है। जब आप किसी वर्ग के उदाहरण में हेरफेर करते हैं, तो केवल वह उदाहरण प्रभावित होता है। –