2010-05-06 13 views
6

निगल लिया गया हो, मैं यूनिट परीक्षणों के लिए विरासत कोड के लिए कुछ उच्च स्तरीय परीक्षण लिखने के लिए जुनीट का उपयोग कर रहा हूं।क्या किसी भी अनचेक अपवाद पर असफल होने के लिए जुनीट को मजबूर करने का कोई तरीका है, भले ही

इस कोड में से अधिकांश कोड NullPointerExceptions जैसे अनचेक अपवादों को "निगलता है" (उदाहरण के लिए, केवल स्टैक ट्रेस प्रिंटिंग और नल लौटकर)। इसलिए यूनिट टेस्ट भी निम्न स्तर कोड में विभिन्न बिंदुओं पर आपदाओं का एक कैस्केड हो सकता है।

क्या पहले अनचेक अपवाद पर परीक्षण विफल होने का कोई तरीका है भले ही वे निगल गए हों?

एकमात्र विकल्प जो मैं सोच सकता हूं वह एक कस्टम जुनीट रैपर लिखना है जो System.err को पुनर्निर्देशित करता है और फिर अपवादों के लिए आउटपुट का विश्लेषण करता है।

+4

नहीं, जुनीट कोड से पहले निगलने पर जुनीट अपवाद के बारे में कैसे जानेंगे? लेकिन शायद आपको विरासत कोड में होने वाली किसी भी चीज़ पर भरोसा नहीं करना चाहिए, और बस जांचें कि आपका कोड सही है।आखिरकार, जब कुछ गलत हो जाता है जिसका आपके कोड के परिणाम पर असर पड़ता है, तो आपका परीक्षण विफल होना चाहिए। – FRotthowe

+0

@FRotthowe: मैं विरासत कोड के मौजूदा घटकों के लिए रिग्रेशन परीक्षण और रैपर परीक्षण लिखने के लिए जुनीट का उपयोग कर रहा हूं। मेरे पास अपना खुद का कोड नहीं है। समस्या यह है कि मैं इन आंतरिक विफलताओं को पकड़ना चाहता हूं, खासकर जब लोग आंतरिक कोड बनाए रखते हैं। – Uri

उत्तर

4

यदि आप अपने आईडीई के डीबगर में परीक्षण निष्पादित करते हैं तो आप अपवाद फेंकने पर आईडीई को तोड़ने के लिए कॉन्फ़िगर कर सकते हैं।

4

एक ठोस समाधान की कमी में, मेरा जवाब बहुत सामान्य:

इस तरह के कोड बदबू आ रही है (उदाहरण के लिए swalling अपवाद) सबसे अच्छा कदम (वर्ग द्वारा वर्ग), जबकि पुराने सिस्टम bugfixing जब आप उन्हें मुठभेड़ से कदम साफ कर रहे हैं। कोड गुणवत्ता उपकरण (जैसे Findbugs, पीएमडी, चेकस्टाइल या यहां तक ​​कि सोनार गुणवत्ता सर्वर) उन चीज़ों को ढूंढने में आपकी सहायता करते हैं।

निस्संदेह अपवादों को "पकड़ने" का एक तरीका स्वचालित रूप से AspectJ कंपाइलर का उपयोग करना है। जब आप कुछ कोड सम्मेलनों का उल्लंघन करते हैं तो आप अपने आईडीई में एक संकलन-समय त्रुटि उत्पन्न करने के लिए पहलुओं की घोषणा कर सकते हैं। वैकल्पिक रूप से, आप परीक्षण के तहत कक्षाओं के रनटाइम पर बुनाई कर सकते हैं और AspectJ को ऐसे अपवादों को फिर से शुरू करने दें, ताकि उन्हें जुनीट धावक द्वारा रिकॉर्ड किया जा सके।

+1

+1 - पीएमडी के पास खाली पकड़ ब्लॉक देखने के लिए पहले से ही एक नियम है। असाधारण हैंडलिंग में विफल होने के अन्य सामान्य तरीकों की तलाश करने के लिए नियम बनाने के लिए शायद इसे विस्तारित करना मुश्किल नहीं होगा। –

0

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

1

मेरा मानना ​​है कि अपवाद एसडीके पुस्तकालयों में सिर्फ एक मानक वर्ग है।

यदि आप इसे निकाला, उसे संशोधित और एसडीके से पहले अपने classpath पर इसे कहीं डाल दिया, मुझे लगता है कि यह SDK में एक बदल दिया जाना चाहिए (आप एसडीके जार में वापस अपने 'नई' अपवाद डाल सकता है यदि नहीं)

वैसे भी, आपका नया अपवाद एक स्थिर मूल्य निर्धारित कर सकता है जिसे परीक्षण ढांचे द्वारा पढ़ा जा सकता है।

सबसे सुरुचिपूर्ण समाधान नहीं हो सकता है, लेकिन यह किसी भी "जादू"

+0

यह इतना आसान नहीं है, क्योंकि कोड जावा में है। पैकेज, और जेडीके के पास उस तरह के टिंकरिंग को रोकने के लिए कुछ सुरक्षा तंत्र हैं जिन्हें आपको आसपास काम करना है। – Yishai

+0

@ यिशई अजीब, मैंने लोगों को यह करने के लिए जाना है लेकिन उन्होंने जो किया उसके मैकेनिक्स में खोद नहीं पाया। मुझे इसे और देखना होगा ... (इसे देखने के बाद, यह पृष्ठ असहमत प्रतीत होता है: http://forums.sun.com/thread.jspa?threadID=30607&tstart=3420) –

+0

हाँ बूट क्लासपाथ है मूल विचार, लेकिन इसका मतलब यह होगा कि अलग-अलग जार में लिपटे अलग-अलग बनाए गए और संकलित वर्ग, या उन कार्यान्वयन को अलग करने के लिए कुछ अन्य फैंसी झुकाव, और फिर आप उस कक्षा को किसी अन्य वर्ग (जैसे जुनीट क्लास) के साथ बातचीत नहीं कर सकते हैं। और आपके परीक्षण को इसे कॉल करना है, न कि दूसरी तरफ। यह करने योग्य है, यह इतना आसान है। – Yishai

1

मैं AOP उपयोग करने के लिए विफलताओं फेंक करने की कोशिश करेगा की आवश्यकता नहीं है। कुछ इस तरह काम करना चाहिए (ध्यान दें, मैं इस परीक्षण नहीं किया है, और आप obviouslly AOP व्याख्या का उपयोग करना AspectJ सेटअप की आवश्यकता है)

public class ClassUnderTest 
{ 
    private static Boolean exceptionThrown; 


    @Before 
    public void resetExceptionFlag() 
    { 
     ClassUnderTest.exceptionThrown = false; 
    } 

    @Test 
    public void myTestMethod() 
    { 

     //.... 
     // My Test Exception Code 
     //.... 

     assertFalse(ClassUnderTest.exceptionThrown); 
    } 

    @Aspect 
    static class TestAspects 
    { 
     @Pointcut("handler(Exception)") 
     public void intereceptAllExceptions(){} 

     //This is Fully Qualified because of the conflict with the junit Before annotation above 
     @org.aspectj.lang.annotation.Before("intereceptAllExceptions()") 
     public void flagExceptionThrown() 
     { 
     ClassUnderTest.exceptionThrown = true; 

    } 

} }

0

शायद आप कोड पेस्ट कर सकते हैं कि आप परीक्षण करने की कोशिश कर रहे हैं। अधिकतर संभावना है कि आपको JVM में क्लासलोडर मैनिपुलेशन में हेरफेर करने के लिए पावरमॉक या जेमॉकिट जैसे कुछ "रीमेपर" परीक्षण ढांचे का उपयोग करना होगा। लेकिन परीक्षण के तहत कक्षा का एक नमूना आवश्यक दृष्टिकोण निर्धारित करने में मदद करेगा।

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

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