2009-11-25 21 views
27

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

स्पष्ट समाधान वास्तव में सावधान जब भी मैं JUnit चलाने -enableassertions उपयोग करने के लिए हो रहा है, लेकिन मैं एक और अधिक मजबूत समाधान पसंद करेंगे। एक विकल्प है कि प्रत्येक टेस्ट क्लास में निम्नलिखित टेस्ट जोड़ें:

@Test(expected=AssertionError.class) 
    public void testAssertionsEnabled() { 
    assert(false); 
    } 

क्या इसे पूरा करने के लिए एक और स्वचालित तरीका है? JUnit के लिए एक सिस्टम-व्यापी विन्यास विकल्प? एक गतिशील कॉल मैं setUp() विधि में डाल सकता हूं?

+1

बस एक सामान्य प्रश्न बनाते समय है। यदि आप वास्तव में पूरी तरह से अपने कोड का परीक्षण करना चाहते हैं, तो क्या आप परीक्षण के बिना और बिना किसी परीक्षण के परीक्षण कर सकते हैं? अप्रत्याशित साइड इफेक्ट्स पेश करने के लिए एक बात यह है कि ** वास्तव में अच्छा ** है। –

+0

बीटीडब्ल्यू। आप जुनीट टेस्टकेस कैसे चला रहे हैं? यदि आपके पास कुछ बिल्ड मैनेजर (चींटी, मैवेन) है तो यह स्विच – jitter

+0

@Alexander द्वारा इस स्विच को जोड़ने के लिए छोटा होना चाहिए: यह एक बुरा विचार नहीं है। @jitter: बेशक आप सही हैं। मेवेन डिफ़ॉल्ट रूप से दावा सक्षम करने लगता है। इससे पहले मैंने ग्रहण नहीं किया था कि ग्रहण के लिए इसकी प्राथमिकता सेटिंग है। समस्या यह है कि इस प्रकार की सेटिंग्स आपकी पीठ के पीछे बदल सकती हैं ... –

उत्तर

5

मैं एक त्वरित परीक्षण के बाद मेरे लिए तीन संभावित (सरल?) ठीक करता है जो काम का प्रस्ताव (लेकिन आप एक स्थिर-प्रारंभकर्ता-ब्लॉक का उपयोग कर के साइड इफेक्ट की जाँच करने की आवश्यकता हो सकती))

1. एक स्थिर जोड़े उन testcases जो दावे पर भरोसा करने के -initializer ब्लॉक सक्षम किया जा रहा

import .... 
public class TestXX.... 
... 
    static { 
     ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); 
    } 
    ... 
    @Test(expected=AssertionError.class) 
    ... 
... 

2.) एक आधार स्तरीय बनाएं जो अपने परीक्षण वर्गों के सभी का विस्तार जो जरूरत दावे सक्षम

public class AssertionBaseTest { 
    static { 
     //static block gets inherited too 
     ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); 
    } 
} 

3.) टेस्ट स्वीट जो आपके सभी परीक्षण

import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    //list of comma-separated classes 
    /*Foo.class, 
    Bar.class*/ 
}) 
public class AssertionTestSuite { 
    static { 
     //should run before the test classes are loaded 
     ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); 
    } 
    public static void main(String args[]) { 
     org.junit.runner.JUnitCore.main("AssertionTestSuite"); 
    } 
} 
+0

+1 बहुत ठंडा छुपा जावा मणि। –

+1

यह मेरे मामले में काम नहीं करता है। यह आदेश पर निर्भर करता है कि कक्षाएं लोड हो जाती हैं। –

+2

क्षमा करें, लेकिन यह अपेक्षित के रूप में काम नहीं करेगा। कक्षा लोड करने और प्रारंभ करने और वर्ग लोडर पर डिफ़ॉल्ट दावा स्थिति सेट करते समय सम्मिलन सक्षम होना चाहिए केवल बाद में लोड किए गए वर्गों को प्रभावित करेगा। – jarnbjo

1

चलाता है मेरा एक दोस्त के रूप में बनाने के लिए कहते हैं ... क्यों समय एक ज़ोर लिखने के लिए ले करता है, तो आप सिर्फ इसे बंद करने जा रहे हैं?

कि तर्क सब जोर बयानों को देखते हुए हो जाना चाहिए:

if(!(....)) 
{ 
    // or some other appropriate RuntimeException subclass 
    throw new IllegalArgumentException("........."); 
} 

अपने प्रश्न के लिए एक रास्ता तो आप शायद :-)

import org.junit.BeforeClass; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 


@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
     FooTest.class, 
     BarTest.class 
     }) 
public class TestSuite 
{ 
    @BeforeClass 
    public static void oneTimeSetUp() 
    { 
     ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); 
    } 
} 

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

+0

जब तक कि दावे को उस बिंदु पर धीमा करने के लिए नहीं दिखाया गया था, जहां यह एक समस्या थी, तो मैं उन्हें हमेशा हर समय रखूंगा। पूर्व शर्त/पोस्ट की स्थिति और किसी अन्य प्रकार के जोरदार बयान - यदि आपने इसे लिखने का समय लिया है तो इसे क्यों बंद करें? – TofuBeer

+0

यदि यह एक पूर्व शर्त है तो मेरा तर्क यह है कि यह किसी दावे के योग्य नहीं है और इसे किसी अवैध आर्ग्यूमेंट अपवाद के रूप में चेक किया जाना चाहिए और जो भी पूर्व शर्त के लिए उचित अपवाद है। पोस्टकंडिशन पूरी तरह से एक जोर देने योग्य हैं, मानते हैं कि यह @NotNull से कुछ और जांच रहा है। – Trejkaz

+0

निजी तरीकों के लिए दावा अभी भी उपयोगी हैं, जहां आप विकास के दौरान पूर्व शर्त जांचना चाहते हैं लेकिन उत्पादन में नहीं। सार्वजनिक इंटरफेस पर अपवादों को प्राथमिकता दें जब तक कि इसका कोई अच्छा कारण न हो। – SigmaX

4

वैकल्पिक रूप से, आप अपने कोड को संकलित कर सकते हैं जैसे कि बंद नहीं हो सकता है। जावा 6 के तहत, आप "fa.jar – Force assertion check even when not enabled" का उपयोग कर सकते हैं, मेरा एक छोटा सा हैक।

+0

कूल विचार! यह मेरे लिए काम नहीं करेगा, हालांकि, अगर यह ग्रहण में काम नहीं करता है। –

21

ग्रहण में आप WindowsPreferencesJavaJUnit, जो -ea हर एक नए लांच विन्यास बनाई गई है जोड़ने के लिए एक विकल्प होता है करने के लिए जा सकते हैं। यह डीबग कॉन्फ़िगरेशन के लिए -ea विकल्प भी जोड़ता है।

एक चेक बॉक्स के बगल में पूरा टेक्स्ट

जोड़े '-ea' वी एम तर्क के लिए एक नया JUnit लांच विन्यास

+0

क्या आपके पास अपने ग्रहण में यूनिट परीक्षण प्लगइन का कोई भी प्रकार है? मुझे वह विकल्प नहीं मिल रहा है। –

+0

नहीं, यह मानक ग्रहण स्थापना का हिस्सा है – RAbraham

+0

ग्रहण का कौन सा संस्करण आप उपयोग करते हैं? –

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