2009-11-03 15 views
9

एक यूनिट परीक्षण कैसे करता है कि निष्पादक सेवा का उपयोग करते समय एक रननेबल कार्य के लिए एक नया धागा उत्पन्न हुआ था?इकाई परीक्षण कैसे करें कि निष्पादक सेवा कार्य के लिए नए धागे को जन्म देती है?

असल में, मेरे पास मेरे आवेदन के लिए एक स्थिर थ्रेड पूल है।

public static final ExecutorService executorService = Executors.newCachedThreadPool(); 

मैं इस थ्रेड पूल, बल्कि एक बाहर मजाक या एक नया थ्रेड पूल इंजेक्शन लगाने से, मेरे इकाई परीक्षण के लिए उपयोग करने के लिए के बाद से विभिन्न धागा पूल नाटकीय रूप से अपने आवेदन के व्यवहार में परिवर्तन कर सकते हैं करना चाहते हैं (फिक्स्ड बनाम कैश बनाम अनुसूचित, आदि); मैं यह सुनिश्चित करना चाहता हूं कि मैं अपने रन-टाइम थ्रेड पूल के साथ एप्लिकेशन के व्यवहार का परीक्षण करूं।

कैश्ड थ्रेड पूल मेरे लिए सबसे अच्छा काम करता प्रतीत होता है। समस्या यह है कि चूंकि यह स्थैतिक है और धागे 60 सेकंड के लिए कैश किए जाते हैं, केवल पहले परीक्षण पूल में एक नया धागा पैदा करेगा, जबकि बाद के परीक्षण उस थ्रेड का पुन: उपयोग करेंगे।

यूनिट परीक्षण कोड: यह कैसे काम कर पाने के लिए, या किसी अन्य दृष्टिकोण पूरी तरह से सराहना की जाएगी पर

public void testDoCallExecutesTaskInAnotherThread() {  
    final Client client = this.createClient(); 
    final ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) client.getExecutorService(); // gets the static thread pool 
    final int initPoolSize = threadPoolExecutor.getPoolSize(); 
    final Response response = client.doCall(); 
    Assert.assertEquals(initPoolSize + 1, threadPoolExecutor.getPoolSize()); 
} 

सलाह।

+0

ग्राहक क्यों कॉल करते हैं यदि ग्राहक अलग थ्रेड में कॉल करता है? मैं चीजों की देखभाल कर सकता हूं, "यह कितना समय लगता है?" या "क्या यह ऑपरेशन एक बाधा के लिए सही ढंग से प्रतिक्रिया करता है।" लेकिन जैसा कि यह खड़ा है, यह यूनिट परीक्षण का एक खराब अनुप्रयोग प्रतीत होता है। – erickson

+0

अच्छा सवाल। इस विशेष ग्राहक को वेब सेवा कॉल को अतुल्यकालिक निष्पादित करना होगा ताकि यह उस ऑब्जेक्ट को न पकड़ सके जो इसका उपयोग करता है - मेरे एप्लिकेशन में एक प्रदर्शन समस्या। मैं प्रतिक्रिया के लिए चारों ओर इंतजार नहीं कर रहा हूं, मैं बस यह सुनिश्चित करना चाहता हूं कि एक वेब सेवा कॉल करने वाला कार्य असीमित रूप से पैदा हुआ था। –

+0

यही मैंने सोचा था। तो आपको वास्तव में क्या परीक्षण करना चाहिए यह है कि क्या यह उस वस्तु को पकड़ता है जो इसका उपयोग करता है "। यही है, यह कितना समय लगता है? मैं डॉकल को इस तरह से कार्यान्वित कर सकता हूं कि इसे वापस करने में दो दिन लगते हैं, लेकिन फिर भी निष्पादक को एक और धागा बनाने का कारण बनता है; आपका यूनिट परीक्षण अभी भी पास होगा, भले ही आपके मानदंड का उल्लंघन हो। – erickson

उत्तर

19

नकली ThreadFactory:

ThreadFactory mock = new CustomObservableThreadFactory(); 
    ExecutorService executorService = Executors.newCachedThreadPool(mock); 
  1. के रूप में हमेशा की तरह
  2. परीक्षण के अंतर्गत वर्ग में ExecutorService सम्मिलित करें लेकिन कैश की गई ThreadPool बनाने के लिए एक कस्टम ThreadFactory का उपयोग करें: ThreadFactory जब भी बुलाया जाएगा एक नया धागा बुलाया जाना है। फिर आप इन इंस्टेंटेशन को अपनी पसंद के अनुसार ढूंढ सकते हैं, उदाहरण के लिए श्रोता या काउंटर के साथ।
संबंधित मुद्दे