2016-07-08 7 views
6

@Mock और @InjectMocks एनोटेशन के साथ हमेशा की तरह मजाक में, परीक्षण के तहत वर्ग @RunWith(MockitoJUnitRunner.class) के साथ चलाने की जानी चाहिए।@RunWith (PowerMockRunner.class) बनाम @RunWith (MockitoJUnitRunner.class)

@RunWith(MockitoJUnitRunner.class) 
public class ReportServiceImplTestMockito { 

    @Mock 
    private TaskService  mockTaskService; 

    @InjectMocks 
    private ReportServiceImpl service; 

     // Some tests 
} 

लेकिन कुछ उदाहरण मैं @RunWith(PowerMockRunner.class) देख रहा हूँ में इस्तेमाल किया जा रहा:

@RunWith(PowerMockRunner.class) 
public class Tests { 
    @Mock 
    private ISomething mockedSomething; 

    @Test 
    public void test1() { 
    // Is the value of mockedSomething here 
    } 

    @Test 
    public void test2() { 
    // Is a new value of mockedSomething here 
    } 
} 

किसी को बाहर बिंदु सकता है क्या अंतर है और जब मैं एक के बजाय एक का उपयोग करना चाहते हैं? अच्छी तरह से, वहाँ कई मजाक चौखटे वहाँ बाहर हैं:

उत्तर

12

एक पहली नज़र पर, जवाब बस है।

लेकिन बदसूरत सत्य है: PowerMock-एक मूल रूप से मदद के लिए एक रोना है। यह कहता है "परीक्षण के तहत कक्षा खराब है, कृपया इसे ठीक करें"।

गंभीरता से; यह अपने उत्पादन कक्षाएं ले जाता है (ताकि बाइट कोड अपने स्रोत से आ रहा) और आदेश स्थिर तरीकों या अंतिम मजाक अनुमति देने के लिए उन manipulates: PowerMock आप कोड है कि अन्य मजाक चौखटे के साथ परीक्षण नहीं किया जा सकता है परीक्षण करने के लिए अनुमति देता है वर्गों/तरीकों। यह बहुत बुरा नहीं लग सकता है, लेकिन मेरा विश्वास करो: यह है।

सबसे पहले, यह मतलब है कि PowerMock अपने कक्षाएं, लेकिन कक्षाओं कि PowerMock चालाकी से परीक्षण नहीं होता है। फिर: यह (अधिक या कम पूरी तरह से) कवरेज टूलिंग चलाने की आपकी क्षमता को मारता है।

और यह सब का सबसे बुरा: विफल रहता है विचित्र के लिए तैयार रहना है, कि तुम समझ में नहीं आता है, कि तुम, घंटे के लिए डीबग कर सकते हैं कुछ भी अपने कोड के साथ गलत कभी नहीं लगता है। विशेष रूप से जब आप पहले से ही अन्य ढांचे के साथ काम कर रहे हैं जो बाइट-कोड मैनिपुलेशन करते हैं।

तो, संक्षेप में: कभी कभी, एक डिजाइन एक तरह से यह असंभव परीक्षण करने के लिए करता है कि में लागू किया गया था। फिर कुछ लोग अभी भी परीक्षण सक्षम करने के लिए उन समस्याओं को दूर करने के लिए PowerMock का उपयोग करने का निर्णय लेते हैं।

लेकिन मेरी आंखों में: आपको PowerMock पर नहीं जाना चाहिए, इसके बजाय आपको बदलना चाहिए, और उन मुद्दों को ठीक करें जो आपको PowerMock के लिए पूछते हैं।

PowerMock उपयोग करने के लिए ही स्वीकार्य कारण है जब आप मौजूदा (शायद 3 पार्टी) कोड है कि आप पूरी तरह से संशोधित नहीं कर सकते परीक्षण करना चाहते हैं।

+1

क्या PowerMock के खिलाफ यह व्यक्तिगत धर्मयुद्ध के साथ हो रहा है !? अब, मैं समझ यह * * कुछ समस्याओं के साथ एक मजाक पुस्तकालय है, लेकिन यह बनाया गया था - वास्तविक समस्याओं कि अंततः आ जब वास्तविक दुनिया परीक्षण लेखन का समाधान करने के प्रयास में (नहीं मेरे द्वारा, BTW मैं एक दूसरे से बनाई गई)। 'FacesContext.getCurrentInstance()' स्थिर विधि ताकि आप 'addMessage (...)' विधि के लिए उम्मीद की कॉल सत्यापित कर सकते हैं मजाक: बस आप एक पूरी तरह से वैध वास्तविक दुनिया स्थिति है जहाँ इस तरह के एक उपकरण उपयोगी होता है देने के लिए। इसके अलावा, यहां किए गए अन्य दावे वास्तव में गलत या अत्यधिक बहस योग्य हैं। –

+0

मेरे अनुभव में, पावर * मॉकिंग फ्रेमवर्क समकक्ष ढांचे के सेट के बाहर * एक * ढांचे नहीं हैं। मेरी आंखों में, यह उत्पाद उन तरह की दवाओं की तरह है, जो केवल दुर्लभ मामलों में ही खाया जाना चाहिए; और आपके डॉक्टर द्वारा बहुत से "ब्रीफिंग" के बाद। बात यह है कि: मैंने PowerMocking से संबंधित समस्याओं को ठीक करने का प्रयास करने में बहुत अधिक घंटे बिताए हैं; या उन लोगों को सुनना जिन्होंने कभी-कभी उन विचित्र समस्याओं को देखा जिन्हें आप कभी सामना करते हैं। और सबसे महत्वपूर्ण बात यह है कि 95% मामलों में, यह बस इतना था कि लोग एक बुरे, अवांछनीय डिजाइन के साथ आए। और इसे बदलने के बजाय, वे PowerMock में बदल गए। – GhostCat

+0

मैं सहमत हूं; टेस्टेबिलिटी समस्याओं को ठीक करने से बचने के लिए डेवलपर्स को एक मॉकिंग लाइब्रेरी नहीं बदलनी चाहिए। यह एक मॉकिंग लाइब्रेरी की सीमाओं के आसपास काम करने के लिए अच्छी ओओ या एपीआई डिज़ाइन से बचने की स्थिति के समान ही सही है। मेरे लिए, इन दोनों परिस्थितियों का सबसे अच्छा जवाब पूरी तरह से मजाक करने से बचने के लिए है, और * एकीकरण * परीक्षण के लिए जाना; यह मैं खुद करता हूं। –

0

PowerMock आप स्थिर और निजी तरीकों के साथ-साथ अंतिम वर्गों और अधिक उपहास करने के लिए अनुमति देता है।

पावरमोक एक ढांचा है जो अन्य शक्तिशाली क्षमताओं के साथ EasyMock जैसे अन्य नकली पुस्तकालयों को बढ़ाता है। PowerMock स्थिर तरीकों, कंस्ट्रक्टर्स, अंतिम वर्गों और विधियों, निजी तरीकों, स्थिर initializers और अधिक की हटाने का मजाक सक्षम करने के लिए एक कस्टम classloader और बाईटकोड हेरफेर का उपयोग करता है।

कुछ कोड गंध हो सकता है अगर आप इसे उपयोगी हो सकता है घटकों, लेकिन के उन प्रकार के नकली की जरूरत है।कुछ बिंदु पर आप किसी पुराने परियोजना है कि स्थिर सहायक वर्गों है निर्भरता मज़ाक उड़ाया करने की आवश्यकता है बनाया में काम किया जा सकता है। आप वास्तुकला को बदलने की क्षमता है, तो अपने डिजाइन ठीक! अन्यथा, अपने परीक्षणों के लिए सही तकनीक का उपयोग करें।

आप न स्थिर या निजी कार्यों के नकली करने की जरूरत की तुलना में आप न PowerMock उपयोग करने के लिए की जरूरत है। पावरमैक अन्य नकली ढांचे के चारों ओर एक रैपर है।

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