2015-02-17 2 views
13

मैं जुनीट को प्रत्येक टेस्ट क्लास को निष्पादित करने के लिए अलग ClassLoader का उपयोग कैसे कर सकता हूं?प्रत्येक जेनिट टेस्ट को एक अलग क्लासलोडर के साथ चलाएं (नहीं, वास्तव में)

मैं एक पुस्तकालय के लिए एक जुनीट TestRunner लिख रहा हूं जो बहुत से स्थिर चर सेट करता है। मैं अनिवार्य रूप से इन सभी को जांचने की आवश्यकता के बिना, प्रत्येक टेस्ट क्लास के बीच इन सभी को रीसेट करना चाहता हूं। मैं ढांचे के अंतरंग ज्ञान के साथ नहीं बनना चाहता, क्योंकि जब भी पुस्तकालय आंतरिक रूप से बदलता है तो मेरा TestRunner टूट जाएगा।

इससे पहले कि मैं आगे जाऊं, मैं बिल्कुल स्पष्ट करना चाहता हूं कि वास्तव में ऐसा करना चाहते हैं।

  • मेरे पास लाइब्रेरी पर नियंत्रण नहीं है।
  • मेरे पास स्थैतिक चर का उपयोग न करने का विकल्प नहीं है।
  • मैं प्रतिबिंब या Powermock का उपयोग नहीं करना चाहता, क्योंकि मैं पुस्तकालय में क्या हो रहा है यह जानने के लिए नहीं चाहता है।
  • मैं फोर्क परीक्षण प्रक्रियाओं में मेवेन कॉन्फ़िगरेशन का उपयोग नहीं करना चाहता, तब परीक्षण उपयोगिता एक निर्माण उपकरण से जुड़ी हुई है।

स्टैक ओवरव्लो पर मुझे जो भी अन्य उत्तर मिल सकता है, वह कहता है "ऐसा मत करो," जो सहायक नहीं है। "स्थिर चर" गूंगा हैं "के साथ जवाब देने वाला पहला व्यक्ति डोनट जीतता है।

+0

मुझे एक डोनट चाहिए! "स्टेटिक वैरिएबल गूंगा हैं" – JNYRanger

+2

आप सर जीते हैं! अपना नाम और पता एक सिंगलटन में रखें जो गिटहब पर स्ट्रिंग को बढ़ाता है और मैं इसे आपके पास पोस्ट करूंगा। –

+0

पकड़ो मुझे फोर्क लॉग 4j दें और इसे वहां फेंक दें। – JNYRanger

उत्तर

8

अंत में मैंने अपना खुद का लिखा, कम से कम another Stack Overflow answer (जो मेरे लिए काम नहीं करता) पर आधारित था।

अब यह गिटहब और मेवेन सेंट्रल पर है। https://github.com/BinaryTweed/quarantining-test-runner

<dependency> 
    <groupId>com.binarytweed</groupId> 
    <artifactId>quarantining-test-runner</artifactId> 
    <version>0.0.1</version> 
</dependency> 

यह उसके अनुसार अपनी परीक्षण कक्षाओं व्याख्या का उपयोग करें:

@RunWith(QuarantiningRunner.class) 
@Quarantine({"com.binarytweed"}) 
public class MyIsolatedTest { 
... 

के रूप में परीक्षण वर्ग अपने आप में एक अलग ClassLoader में लोड करने की आवश्यकता जुड़ा हुआ जवाब मेरे लिए काम नहीं किया है, तो के रूप में सभी वर्गों के संदर्भ में एक ही लोडर का उपयोग किया जाएगा। क्वारंटाइनिंग समावेशी है (अनन्य के बजाए) क्योंकि आपको JUnit @Test एनोटेशन को पैरेंट ClassLoader द्वारा लोड करने की आवश्यकता है, अन्यथा JUnit को कोई टेस्ट करने योग्य विधियां नहीं मिल सकती हैं क्योंकि यह लुकअप मैप में एक कुंजी के रूप में Class<Test> का उपयोग करती है।

1

माईफेसेस में TestPerClassLoaderRunner है जो (इसके नाम के बावजूद) जो आप खोज रहे हैं।

+0

धन्यवाद। मैंने कोशिश की है, और यह 'java.lang.Object' खोजने में विफल रहता है! मुझे लगता है कि मुझे इसे 'वर्तमान' कक्षा के माध्यम से पारित करने की आवश्यकता है ... –

+0

क्या आपने इसे मेवेन से शुरू किया था? ऐसा लगता है कि यह अपनी कक्षा पथ संरचना के लिए बहुत विशिष्ट है। – eckes

+0

नाह, ग्रहण। यह एक जाने देगा, और यदि यह काम करता है तो देखें कि क्या मैं इसे या तो काम करने के लिए पर्याप्त सामान्य बना सकता हूं। –

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