2010-09-13 12 views
9

100% कोड कवरेज के प्रयासों में, मुझे ऐसी स्थिति में आया जहां मुझे InterruptedException पकड़ने वाले कोड के यूनिट परीक्षण ब्लॉक की आवश्यकता है। यह सही ढंग से परीक्षण कैसे करता है? (JUnit 4 वाक्य रचना कृपया)"इंटरप्टेड एक्सेप्शन" के लिए यूनिट टेस्ट कैसे लिखें

private final LinkedBlockingQueue<ExampleMessage> m_Queue; 

public void addMessage(ExampleMessage hm) { 
    if(hm!=null){ 
     try { 
      m_Queue.put(hm); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

उत्तर

13

सही addMessage() लागू करने से पहले, Thread.currentThread().interrupt() कहते हैं। यह धागे पर "बाधा" स्थिति ध्वज सेट करेगा। (तर्क संयुक्त राष्ट्र ताला है)

तो बाधित स्थिति जब put() करने के लिए कॉल एक LinkedBlockingQueue पर किया जाता है सेट कर दिया जाता है, एक InterruptedException बढ़ा दी जाएगी, भले ही कोई प्रतीक्षा put लिए आवश्यक है।

वैसे, 100% कवरेज तक पहुंचने के कुछ प्रयास काउंटर-उत्पादक हैं और वास्तव में कोड की गुणवत्ता को कम कर सकते हैं।

+1

+1, यह सच है। 80-85 के लिए लक्ष्य रखें और आप इस तरह की सभी समस्याओं से बचेंगे और फिर भी अपना कोड बहुत पुराना रखें। – BjornS

+1

यह काफी क्रूर समाधान है और अप्रत्याशित साइड इफेक्ट्स हो सकता है। उदाहरण के लिए, मैंने पाया कि एक परीक्षण विधि में Thread.currentThread()। Interrupt() को कॉल करना उसी वर्ग में सभी परीक्षण विधियों को प्रभावित करेगा, जिससे अन्य सभी परीक्षण विफल हो जाएंगे। मैंने यह भी पाया कि किसी भी टेस्ट क्लास में इसे जोड़ने से सोनार 0% यूनिट टेस्ट कवरेज (क्यों नहीं पता चला है) की रिपोर्ट करेगा। – RCross

+0

हां, आपको सावधान रहना होगा कि आपने इसका उपयोग कहां किया था, यह सुनिश्चित कर लें कि इंटरप्ट स्थिति को साफ़ कर दिया जाएगा (जैसा कि यह यहां है) और यह कि आपकी सेटिंग और आपके परीक्षण की जांच के बीच स्थिति की कोई हस्तक्षेप जांच नहीं है। – erickson

9

Easymock की तरह एक मजाक पुस्तकालय का उपयोग करें और एक नकली LinkedBlockingQueue

यानी

@Test(expect=InterruptedException.class) 
public void testInterruptedException() { 
    LinkedBlockingQueue queue = EasyMock.createMock(LinkedBlockingQueue.class); 
    ExampleMessage message = new ExampleMessage(); 
    queue.put(message); 
    expectLastCall.andThrow(new InterruptedException()); 
    replay(queue); 
    someObject.setQueue(queue); 
    someObject.addMessage(msg); 
} 
+0

बिल्कुल सबसे अच्छा तरीका है। इससे भी ज्यादा समस्याएं हल करती हैं। –

1

एक अन्य विकल्प अमरूद के Uninterruptibles को InterruptedException से निपटने को सौंपने के लिए है इंजेक्षन, तो आप की जरूरत नहीं है इसके लिए अपना कस्टम कोड लिखें और परीक्षण करें:

import static com.google.common.util.concurrent.Uninterruptibles.putUninterruptibly; 

private final LinkedBlockingQueue<ExampleMessage> queue; 

public void addMessage(ExampleMessage message) { 
    putUninterruptibly(queue, message); 
} 
संबंधित मुद्दे