2011-10-12 4 views
11

साथ JUnit @Rule जीवन चक्र बातचीत मुझे लगता है कि TemporaryFolder@Rule का उपयोग कुछ JUnit परीक्षण किया है। वे एक @Before विधि में TemporaryFolder का उपयोग कुछ सेटअप प्रदर्शन करने के लिए:@Before

@Rule 
public TemporaryFolder folder = new TemporaryFolder(); 

@Before 
public void init() { 
    folder.newFile("my-file.txt"); 
} 

@Test 
public void myTest() { ... } 

समय इस पूरी तरह से काम करता है के अधिकांश। हालांकि, जब का उपयोग कर SpringJUnit4ClassRunner मुझे लगता है कि कुछ मामलों में init() विधि मेरी TemporaryFolder उदाहरण के अंदर Statement से पहले शुरू हो जाती है लागू किया जाता है। इस वजह से, अस्थायी फ़ोल्डर स्थान सेट नहीं की जाती हैं (यानी: null) जब folderinit() भीतर प्रयोग किया जाता है और मेरी फाइल, /tmp काम कर निर्देशिका में समाप्त होता है नहीं।

कुछ मामलों @Before तरीकों नियमों के आगे क्रियान्वित कर रहे हैं में

तो, हालांकि, मैं एक निश्चित पैटर्न स्थापित नहीं कर सकते। मैं कभी-कभी अपने कुछ नियम कार्यान्वयन के साथ एक समान समस्या देखता हूं।

क्या कोई तरीका है कि मैं यह सुनिश्चित कर सकता हूं कि मेरे नियम विवरण किसी भी सेटअप विधियों से पहले लागू हो जाएं?

उत्तर

11

जुनीट 4.10 में, ब्लॉकजुनिट 4 क्लासरुनर (स्प्रिंगजुनीट 4 क्लासरुनर का सुपरक्लास) स्टेटमेंट चेन बनाने के लिए इस तरह से देखभाल करता है कि नियम किसी भी @ पहले तरीके से पहले चलते हैं। JUnit 4.10 से:

protected Statement methodBlock(FrameworkMethod method) { 
    // ... 
    Statement statement= methodInvoker(method, test); 
    statement= possiblyExpectingExceptions(method, test, statement); 
    statement= withPotentialTimeout(method, test, statement); 
    statement= withBefores(method, test, statement); 
    statement= withAfters(method, test, statement); 
    statement= withRules(method, test, statement); 
    return statement; 
} 

JUnit 4.7 प्रकट होता है एक साथ वक्तव्य चेन सिलाई करने के लिए एक अलग क्रम में:

Statement statement= methodInvoker(method, test); 
statement= possiblyExpectingExceptions(method, test, statement); 
statement= withPotentialTimeout(method, test, statement); 
statement= withRules(method, test, statement); 
statement= withBefores(method, test, statement); 
statement= withAfters(method, test, statement); 
return statement; 

वसंत-परीक्षण 3.0.5 के माता-पिता पोम संकेत मिलता है कि यह JUnit 4.7 पर निर्भर करता है लगता है। मुझे आश्चर्य है कि अगर इसे एक नया जुनीट इस्तेमाल करने में मदद मिलेगी तो मदद मिलेगी?

+1

अच्छा खोज @pholser। मैं जुनीट 4.8.एक्स का उपयोग कर रहा हूं और यह 4.10 के समान क्रम में श्रृंखला बनाने के लिए प्रतीत होता है। हालांकि, methodBlock() को SpringJUnit4ClassRunner में ओवरराइड किया गया है और जुनीट 4.7 के समान एक अलग क्रम सेट करता है। – teabot

0

क्या इसके लायक है के लिए, मैं का उपयोग किया है एक त्वरित समाधान के रूप में निम्नलिखित:

@Rule 
public TemporaryFolder tmpFolder = new TemporaryFolder() { 
    @Override 
    protected void before() throws Throwable { 
     if (getRoot() == null) { 
      super.before(); 
     } 
    } 

    @Override 
    public File newFile(String fileName) throws IOException { 
     try { 
      before(); 
     } 
     catch (Throwable t) { 
      throw new RuntimeException(t.getMessage(), t); 
     } 

     return super.newFile(fileName); 
    } 

    @Override 
    public File newFolder(String folderName) { 
     try { 
      before(); 
     } 
     catch (Throwable t) { 
      throw new RuntimeException(t.getMessage(), t); 
     } 

     return super.newFolder(folderName); 
    } 
}; 

यह सुनिश्चित करता है कि TemporaryFolder ठीक से प्रारंभ होता है, @Before तरीकों से पहले या नियमों के बाद चलाए जा रहे हैं चाहे।

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