2011-12-15 9 views
5

मैं अपनी 'आयातक सेवा' कक्षा का परीक्षण करने के लिए एक टेस्ट क्लास लिख रहा हूं। यह सेवा एक इनपुटस्ट्रीम पढ़ती है और इसके डेटा से ऑब्जेक्ट बनाता है। वस्तु, इस मामले में एक बिल्डर वर्ग, 'आयातक सेवा' कक्षा के भीतर तत्काल है। मेरी 'आयातक सेवा' कक्षा का परीक्षण करने के लिए मुझे बिल्डर वर्ग पर आमंत्रण सत्यापित करने की आवश्यकता है। इसके लिए मैं एक मॉकिंग फ्रेमवर्क का उपयोग करना चाहता हूं, हालांकि 'आयातक सेवा' के बाहर 'बिल्डर' ऑब्जेक्ट का नकली उदाहरण बनाना संभव है?आंतरिक तत्काल ऑब्जेक्ट का मजाक

मेरे 'ImporterService' वर्ग की विधि लगता है:

 


    public Builder importFrom(BufferedReader reader) throws IOException { 
     String someValue = readFrom(reader); 
     Builder builder = new Builder(); // I need to mock this Builder object... 
     builder.someMethod(someValue);  // to see of a method is called with the expected value 
    } 
 

मैं एक संरक्षित विधि है जो मैं परीक्षण की स्थापना पर ओवरराइड कर सकते हैं में बिल्डर वर्ग के निर्माण के जाने के बारे में सोच रहा था। लेकिन यह समाधान मेरे लिए बहुत अच्छा नहीं लगता है क्योंकि 'आयातक सेवा' कक्षा कुछ आंतरिक तर्क लीक कर रही है और अन्य वर्गों द्वारा विधि को ओवरराइड करना संभव बनाता है जो मैं नहीं चाहता हूं।

उत्तर

2

यदि आप किसी भी निर्भरता इंजेक्शन लाइब्रेरी (वसंत की तरह) का उपयोग करते हैं तो आप आयातक सेवा वर्ग के निर्माता के बजाय नकली वस्तु इंजेक्ट कर सकते हैं। या आप फैक्ट्री पर कॉल के साथ कन्स्ट्रक्टर को कॉल कर सकते हैं और फैक्ट्री का उपयोग कर सकते हैं, जो टेस्ट कोड में मैक्स लौटाता है।

+0

: आप निम्न उपाय अपनाते हैं

public class Reader{ private BuilderFactory factory = new BuilderFactory(); // Use production factory by default public Builder importFrom(BufferedReader reader) throws IOException { String someValue = readFrom(reader); Builder builder = factory.buildBuilder(); builder.someMethod(someValue); // to see of a method is called with the expected value } } 

अपने इकाई परीक्षण में:

यहाँ दिखा कैसे आप इस लक्ष्य को हासिल कर सकते हैं EasyMock का उपयोग कर एक उदाहरण है वसंत में या एक और डीआई आपके यूनिट परीक्षण ढांचे। जब तक आप अपने तारों का परीक्षण नहीं कर लेते हैं –

0

आप jMockt उपयोग कर रहे हैं (मैं इस मजाक ढांचे recomment) मानते हुए, आपको निम्न कार्य करने में सक्षम हो जाएगा:

@Test 
    public void testFoo(@Mocked Builder builder) { 
     new Expectations() { 
      { 
       new Builder(); 
       returns(builder); 

       builder.setSomemethod() 
       ... 
      } 
     }; 

     assertSame(builder,impoertesService.importFrom(...)); 
    } 
0

ऐसे PowerMock के रूप में कुछ मजाक चौखटे वस्तुओं के निर्माण के नकली कर सकते हैं। ऐसा करके

public Builder importFrom(BufferedReader reader, Builder builder) throws IOException { 

आप अपने परीक्षण मामले से किसी भी डमी कार्यान्वयन पारित कर सकते हैं:

0

आप कुछ इस तरह के समारोह हस्ताक्षर बदल सकते हैं। यह निर्भरता इंजेक्शन का एक तरीका है।

निर्भरता इंजेक्शन का विचार आपकी सभी निर्भरताओं के लिए पूछना है और यदि कोई कक्षा/कार्य करता है, तो कोड अत्यधिक परीक्षण योग्य हो जाता है।

1

हाँ, आप कर सकते हैं या तो के रूप में आप का सुझाव दिया या:

एक फैक्टरी वर्ग है जिसमें आप Builder वस्तुओं को बनाने और पाठक वर्ग के लिए असाइन करें बनाएँ। अपने यूनिट परीक्षणों में, इस कारखाने का मज़ाक उड़ाएं और इसे अपनी पसंद के Builder बनाने के लिए मजबूर करें ताकि आप अपने यूनिट परीक्षण में विधि कॉल की जांच कर सकें। आप अच्छा मजाक ढांचे का उपयोग कर रहे हैं, तो आप की जरूरत नहीं है

Reader classUnderTest = new Reader(); 
BuilderFactory fakeFactory = EasyMock.createNiceMock(BuilderFactory.class); 
Builder builder = EasyMock.createMock(Builder.class); 
EasyMock.expect(fakeFactory.buildBuilder()).andReturn(builder); 
builder.someMethod("value here"); 
EasyMock.expectLastCall().once(); 
EasyMock.replay(fakeFactory, builder); 
classUnderTest.importFrom(bufferReader); 
// Very that all calls were correctly performed on the builder 
EasyMock.verify(builder); 
संबंधित मुद्दे