java - Inject Mocks for objects created by Factory classes -


मेरे पास निम्न श्रेणी है:

  सार्वजनिक वर्ग MyClass {निजी एप्पल सेब; सार्वजनिक शून्य मेरी पद्धति () {apple = AppleFactory.createInstance (someStringVariable); .... .... ....}}  

और टेस्ट क्लास:

  @RunWith (मॉकिटाज्यूनेटरनर.क्लास) सार्वजनिक वर्ग MyClassTest {@InjectMocks MyClass myClass; @Test सार्वजनिक void myMethod () {... ... ...}}  

मैक्सेल में एक नकली के रूप में मैं एक ऐप्पल इंस्टैंस को कैसे इंजेक्ट कर सकता हूं?

आप इसे हल करने के लिए 3 संभावनाएं हैं:

सार फैक्ट्री : उपयोग के बजाय एक स्थिर विधि, एक ठोस कारखाना वर्ग का उपयोग करें:

  सार्वजनिक सार वर्ग AppleFactory {सार्वजनिक ऐप्पल बनाना अंतर (अंतिम स्ट्रिंग str); } सार्वजनिक श्रेणी के AppleFactoryImpl एप्पलफैक्चर (सार्वजनिक ऐप्पल बनाने की व्यवस्था) (अंतिम स्ट्रिंग str) {// कार्यान्वयन}}  

अपने परीक्षण वर्ग में, कारखाना का नकली:

  @ रनविथ (मॉकिटाज्यूनेटरनर.क्लास) सार्वजनिक कक्षा मायक्लसटेस्ट {@ मॉक प्राइवेट ऐपलफैक्ट्रीफ़ाफ़ाफ़ाईलमॉक; @ मॅक प्राइवेट एप्पल एप्पल मॉक; @InjectMocks MyClass myClass; @ सार्वजनिक निष्क्रिय सेटअप से पहले (जब (appleFactoryMock.createInstance (Matchers.anystring ())। फिर से (AppleMock);} @Test सार्वजनिक void myMethod () {... ... ...}}  

पावरमॉक : एक स्थिर विधि का नकली बनाने के लिए पावरमॉक का उपयोग करें। यह देखने के लिए कि यह कैसे किया गया है।

परीक्षण योग्य वर्ग : ऐप्पल निर्माण को एक संरक्षित विधि में लपेटा और एक परीक्षा वर्ग बनाओ जो उसे ओवरराइड कर देता है:

  सार्वजनिक वर्ग के मायक्लस {निजी एप्पल सेब; सार्वजनिक शून्य myMethod () {apple = createApple (); .... .... ....} संरक्षित एप्पल बनाओअपपल () {वापस AppleFactory.createInstance (कुछ StringVariable);}} @RunWith (MockitoJUnitRunner.class) पब्लिक क्लास MyClassTest {@Mock Private Apple AppleMock; @InjectMocksMyClass myClass; @Test सार्वजनिक void myMethod () {... ... ...} निजी वर्ग TestableMyClass MyClass का विस्तार करता है {@Override सार्वजनिक शून्य बनाएँआपले () {return appleMock; }}}  

बेशक, अपने परीक्षण वर्ग में आपको TestableMyClass और MyClass नहीं की जानी चाहिए।

मैं आपको प्रत्येक विधि पर अपनी राय बताऊंगा:

  1. सार कारखाना विधि सबसे अच्छी है - यह एक स्पष्ट डिजाइन है जो छुपाता है कार्यान्वयन विवरण

  2. परीक्षण योग्य वर्ग - दूसरा विकल्प है जिसमें न्यूनतम परिवर्तन की आवश्यकता है

  3. PowerMock विकल्प है मेरी कम से कम पसंदीदा - बेहतर डिजाइन करने के बजाय, आप अपनी समस्या को नजरअंदाज और छिपाने लेकिन यह अभी भी एक वैध विकल्प है।

Comments