2012-05-14 13 views
7

नकल करने के लिए कैसे करें मैं जावा लाइब्रेरी का उपयोग करने वाले कुछ ग्रोवी कोड का परीक्षण कर रहा हूं और मैं लाइब्रेरी कॉल का मज़ाक उड़ाता हूं क्योंकि वे नेटवर्क का उपयोग करते हैं। तो परीक्षण के अंतर्गत कोड तरह दिखता है:'नया' ऑपरेटर

def verifyInformation(String information) { 
    def request = new OusideLibraryRequest().compose(information) 
    new OutsideLibraryClient().verify(request) 
} 

मैं MockFor और StubFor उपयोग करने की कोशिश, लेकिन मैं इस तरह के रूप में त्रुटियाँ मिलती है:

No signature of method: com.myproject.OutsideLibraryTests.MockFor() is applicable for argument types: (java.lang.Class) values: [class com.otherCompany.OusideLibraryRequest] 

मैं Grails 2.0.3 का उपयोग कर रहा हूँ।

उत्तर

5

दूसरे, वैकल्पिक पैरामीटर MockFor's constructor को interceptConstruction है। यदि आप इसे सत्य पर सेट करते हैं, तो आप कन्स्ट्रक्टर का नकल कर सकते हैं। उदाहरण:

import groovy.mock.interceptor.MockFor 
class SomeClass { 
    def prop 
    SomeClass() { 
     prop = "real" 
    } 
} 

def mock = new MockFor(SomeClass, true) 
mock.demand.with { 
    SomeClass() { new Expando([prop: "fake"]) } 
} 
mock.use { 
    def mockedSomeClass = new SomeClass() 
    assert mockedSomeClass.prop == "fake" 
} 

नोट, हालांकि, आप केवल इस तरह की ग्रोवी ऑब्जेक्ट्स का नकल कर सकते हैं। यदि आप जावा लाइब्रेरी से फंस गए हैं, तो आप जावा ऑब्जेक्ट के निर्माण को फ़ैक्टरी विधि में खींच सकते हैं और उस पर नकल कर सकते हैं।

8

मैं सिर्फ पाया है कि हम हमेशा MetaClass के माध्यम से एक निर्माता के ऊपर लिख सकते हैं, Grails 2 के रूप में प्रत्येक परीक्षा के अंत में MetaClass संशोधन रीसेट कर दिया जाएगा।

यह चाल ग्रोवी के MockFor से बेहतर है। AFAIK, ग्रोवी का MockFor उदाहरण के लिए, जेडीके के वर्गों, java.io.File पर नकल करने की अनुमति नहीं देता है। हालांकि नीचे दिए गए उदाहरण में, आप File file = new File("aaa") का उपयोग नहीं कर सकते क्योंकि असली ऑब्जेक्ट प्रकार Map है, File नहीं। उदाहरण एक स्पॉक विनिर्देश है।

def "test mock"() { 
    setup: 
    def fileControl = mockFor(File) 
    File.metaClass.constructor = { String name -> [name: name] } 
    def file = new File("aaaa") 

    expect: 
    file.name == "aaaa" 
} 
संबंधित मुद्दे