2012-04-18 5 views
19

परीक्षण के दौरान आंतरिक रूप से बुलाया जा सकता है। मैं नीचे दिए गए एक जैसा वर्ग सेवा में methodA() के लिए एक परीक्षा लिख ​​रहा हूं।Grails: मैं परीक्षण के तहत कक्षा के अन्य तरीकों का नकल कैसे करता हूं जिसे

Class SampleService { 
    def methodA(){ 
    methodB() 
    } 

    def methodB(){ 
    } 
} 

जब मैं MethodA() का परीक्षण, मैं methodB करने के लिए कॉल (उपहास करने के लिए सक्षम होना चाहिए) MethodA परीक्षण जब()। मैं grails के संस्करण 2.0.x का उपयोग कर रहा हूँ। 1.3.x वितरण में, मैं इस

def sampleServiceMock = mockFor(SampleService) 
sampleServiceMock.demand.methodB { -> } 

की तरह एक आत्म नकली लिखते थे लेकिन इस 2.0.x संस्करणों में काम नहीं करता। मैं सोच रहा था कि methodA()

+0

क्या कोई जानता है कि स्पेल के साथ Grails 3.2.8 के लिए यह कैसे करें? – nbkhope

उत्तर

34
इस तरह की समस्या मैं वास्तव में mocks से बचने और निर्मित groovyProxy एक प्रॉक्सी वस्तु के रूप में बंद होने का एक नक्शा कास्ट करने के लिए क्षमता का उपयोग करने के लिए

। यह आपको अधिरोहित कुछ तरीकों के साथ एक उदाहरण देता है, लेकिन दूसरों के वास्तविक वर्ग के लिए के माध्यम से पारित:

class SampleService { 
    def methodA() { 
     methodB() 
    } 

    def methodB() { 
     return "real method" 
    } 
} 

def mock = [methodB: {-> return "mock!" }] as SampleService 

assert "mock!" == mock.methodA() 
assert "real method" == new SampleService().methodA() 

मुझे पसंद है कि केवल एक उदाहरण, एक पंक्ति में किया जा सकता है बदलता है, और metaclass साथ गड़बड़ नहीं है उस उदाहरण के बाहर कुछ भी जिसे साफ करने की जरूरत है।

+1

हाँ, यह व्यवहार करने का एक शानदार तरीका प्रतीत होता है। मैं अभी भी grails 'mockFor() :( –

+0

का उपयोग करके स्वयं नकली करने की क्षमता को याद करता है, यह मेरी grails परीक्षण दुःख हल करता है, बहुत बहुत धन्यवाद! – EdgeCaseBerg

+0

शानदार। यह मुझे मदद की और साथ ही परीक्षण मैं स्पॉक बंद कर रहा था और जोर देने में असमर्थ था नियंत्रक से लौटाए गए वास्तविक मान (जब सेवा कॉल का मज़ाक उड़ाते हैं)। –

12

परीक्षण करने के दौरान विधिवत मॉकिंग विकल्पों के अन्य तरीके क्या हैं, ग्रोवी के साथ कई मॉकिंग विकल्प हैं। आप Groovy Mocks, using Maps and Expandos instead of Mocks या using Closures instead of Mocks के कुछ दस्तावेज़ देख सकते हैं।

आपके उदाहरण में, मैं ग्रोवी की मेटाप्रोग्रामिंग क्षमताओं का उपयोग करूंगा।

void testMethodA() { 
    service = new SampleService() 
    service.metaClass.methodB = { -> return "what you want" } 
    service.methodA() 
    assert "your condition" 
} 
+2

मैंने अंततः मॉकिंग के लिए इस दृष्टिकोण का उपयोग किया था। लेकिन, अर्थात् बोलते हुए, परीक्षा उत्तीर्ण करने के लिए कक्षा के हस्ताक्षर को बदलना चरम लगता है :) –

+0

और मेटाकैस अन्य परीक्षणों में भी रिसाव बदलता है। –

+0

लिंक (ग्रोवी मोक्स, मैक्स के बजाय मैप्स और एक्सपैंडोस का उपयोग करके या मोक्स के बजाय क्लोजर का उपयोग करके) अब काम नहीं कर रहे हैं, कृपया उन्हें ठीक करें या हटाएं। धन्यवाद। – GSAN

संबंधित मुद्दे