2011-12-01 11 views
6

मैं परीक्षण सेटअप में निम्नलिखित है:मैं ग्रोवी में एक नकली स्थैतिक विधि कैसे रीसेट करूं?

def originalPostAsXml = RestClient.&postAsXml 

    RestClient.metaClass.'static'.postAsXml = { 
     String uriPath, String xml -> 
     return 65536 
    } 

और परीक्षण की सफाई में:

RestClient.metaClass.'static'.postAsXml = originalPostAsXml 

लेकिन जब अगले परीक्षण रन, जब यह RestClient.postAsXml पर अमल करने की कोशिश करता है, इसे में चलाता है एक StackOverflowError:

at groovy.lang.Closure.call(Closure.java:282) 

ऐसा लगता है कि RestClient.postAsXml रिकर्सिवली खुद को इंगित करता है। एक मॉक-आउट स्थैतिक विधि को रीसेट करने का सही तरीका क्या है? विधि रीसेट करने के लिए

def originalPostAsXml = RestClient.metaClass.getMetaMethod('postAsXml', [String, String] as Class[]) 

तो:

+0

यहाँ पिछले एक समान सवाल है: http://stackoverflow.com/questions/920582/how-to-change-behaviour-of-the-methed-in-groovy-using -थैट-विधि-इन-मेटाक्लास – schmolly159

+0

आप मेटाक्लास को रीसेट कर सकते हैं - इस प्रश्न को देखें जिसका जवाब है http://stackoverflow.com/questions/1612569/how-do-i-undo-meta-class-changes-after-executing -groovyshell –

उत्तर

1

schmolly159 के संकेत ऊपर निम्नलिखित समाधान के लिए मुझे नेतृत्व

RestClient.metaClass.'static'.postAsXml = { String uriPath, String xml -> 
     originalPostAsXml.invoke(delegate, uriPath, xml) 
    } 
6

एक इकाई परीक्षण में, मैं अक्सर metaclass null को tearDown() में सेट जो ऐसा लगता है कि वर्ग को काम करने की इजाजत दी गई है क्योंकि यह मूल रूप से मेरे संशोधनों के बिना किया गया था।

उदाहरण:

void setUp() { 
    super.setUp() 
    ServerInstanceSettings.metaClass.'static'.list = { 
     def settings = [someSetting:'myOverride'] as ServerInstanceSettings 
     return [settings] 
    } 
} 

void tearDown() { 
    super.tearDown() 
    ServerInstanceSettings.metaClass.'static'.list = null 
} 

आप आप के बजाय इस मामले जो और अधिक समझ में शायद बनाता में @AfterClass उपयोग कर सकते हैं JUnit4 उपयोग कर रहे हैं।

2

मुझे लगता है कि बस <Class>.metaClass = null मेरे लिए काम करता है।

स्पॉक उदाहरण:

def "mockStatic Test"(){ 
    given: 
    RestClient.metaClass.static.postAsXml = { 
    String uriPath, String xml -> 
    return 65536 
    } 

    when: 
    //some call that depends on RestClient.postAsXml 

    then: 
    //Expected outcomes 

    cleanup: 
    //reset metaclass 
    RestClient.metaClass = null 
} 
संबंधित मुद्दे