2011-08-17 16 views
6

मुझे कुछ ऑब्जेक्ट बनाने के लिए कारखाने का उपयोग करके कक्षा मिली है। मेरे यूनिट परीक्षण में मैं कारखाने के वापसी मूल्य तक पहुंच बनाना चाहता हूं। चूंकि कारखाना सीधे कक्षा में पास हो जाता है और निर्मित वस्तु के लिए कोई गेटटर प्रदान नहीं किया जाता है, इसलिए मुझे कारखाने से ऑब्जेक्ट को वापस करने में अवरोध करने की आवश्यकता होती है।मॉकिटो + जासूस: रिटर्न वैल्यू कैसे इकट्ठा करें

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(factory); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 

क्या कारखाने के वापसी मूल्य तक पहुंचने की संभावना है? शायद जासूस का उपयोग कर?
एक ही रास्ता मैं देख सकता हूँ उपहास करने के लिए कारखाना विधि बनाने है ...

सादर

+0

क्यों 'TestedClass' निर्भरता के रूप में कारखाने में ले जाना चाहिए। क्या यह सिर्फ कारखाने द्वारा बनाई गई वास्तविक कक्षा के लिए नहीं पूछना चाहिए। ? (डेमेटर का कानून) –

+0

'टेस्टेड क्लास' एक ओएसजीआई-घटक है। घटक की एक विधि के लिए प्रत्येक आमंत्रण कारखाने द्वारा बनाई गई एक नई वस्तु की आवश्यकता होती है। बेहतर टेस्टेबिलिटी प्रदान करने के लिए मैंने फैक्ट्री क्लास में वस्तु निर्माण को दोबारा तैयार किया। चूंकि बनाई गई वस्तु विधि पैरामीटर के आधार पर आरंभ की जाती है, इसलिए फैक्ट्री के बजाय बनाए गए ऑब्जेक्ट्स को बस पास करने का कोई तरीका नहीं है। –

उत्तर

1

मानक मजाक दृष्टिकोण करने के लिए होगा:

  1. पूर्व बनाने वस्तु आप कारखाने चाहते हैं परीक्षण मामले में लौटने के लिए
  2. फैक्टरी
  3. अपने पूर्व-निर्मित ऑब्जेक्ट को वापस करने के लिए नकली फैक्ट्री को लिखें।

तुम सच में RealFactory मक्खी पर वस्तु बनाने करना चाहते हैं, तो आप यह उपवर्ग और super.create(...) कॉल करने के लिए है, तो एक क्षेत्र परीक्षण वर्ग द्वारा पहुँचा जा सकता है, और फिर वापसी के संदर्भ में बचाने के कारखाने विधि ओवरराइड कर सकते हैं बनाई गई वस्तु।

24

पहली बात, आपको spy को कन्स्ट्रक्टर तर्क के रूप में पास करना चाहिए।

उस तरफ, आप यह कैसे कर सकते हैं।

public class ResultCaptor<T> implements Answer { 
    private T result = null; 
    public T getResult() { 
     return result; 
    } 

    @Override 
    public T answer(InvocationOnMock invocationOnMock) throws Throwable { 
     result = (T) invocationOnMock.callRealMethod(); 
     return result; 
    } 
} 

इरादे से उपयोग:

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(spy); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 


// let's capture the return values from spy.create() 
ResultCaptor<RealThing> resultCaptor = new ResultCaptor<>(); 
doAnswer(resultCaptor).when(spy).create(); 

// do something that will trigger a call to the factory 
testedClass.doSomething(); 

// validate the return object 
assertThat(resultCaptor.getResult()) 
     .isNotNull() 
     .isInstanceOf(RealThing.class); 
+0

साझा करने के लिए धन्यवाद। आईएमएचओ: यह स्वीकार्य उत्तर होना चाहिए। – BetaRide

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