2013-10-04 11 views
6

मैं अपने टेस्ट क्लास में कई बाहरी संसाधनों का उपयोग करना चाहता हूं, लेकिन मुझे बाहरी संसाधनों के ऑर्डर करने में समस्या है।जुनीट बाहरी संसाधन @ नियम आदेश

public class TestPigExternalResource { 

    // hadoop external resource, this should start first 
    @Rule 
    public HadoopSingleNodeCluster cluster = new HadoopSingleNodeCluster(); 

    // pig external resourcem, this should wait until hadoop external resource starts 
    @Rule 
    public PigExternalResource pigExternalResource = new PigExternalResource(); 

    ... 
} 

समस्या इसलिए मैं कनेक्ट नहीं हो सका स्थानीय Hadoop एकल नोड क्लस्टर, यह सुअर शुरू करने के लिए इससे पहले कि Hadoop शुरू कर दिया की कोशिश करता है:

यहाँ कोड का टुकड़ा है।

क्या जूनिट के नियमों का आदेश देने का कोई तरीका है?

धन्यवाद

+0

क्या हैडोपसिंगल नोडक्लस्टर 'कक्षा सार्वजनिक रूप से उपलब्ध है? जैसा कि मैं 'org.apache.hadoop.mapred.ClusterMapReduceTestCase' का उपयोग करता हूं, लेकिन यह स्थिर नहीं है। –

+0

@nefo_x ** HadoopSingleNodeCluster ** मेरी अपनी कक्षा है, हैडूप वितरण में उपलब्ध नहीं है। –

+0

क्या यह कुछ मौजूदा कोडबेस पर आधारित है? मैं क्लस्टर मैप्रेडस टेस्टकेस का उपयोग करने की कोशिश करता हूं, लेकिन यह बाहरी जेवीएम लॉन्च करता है और कुछ मामलों में डीबगिंग के लिए यह थोड़ा मुश्किल है। –

उत्तर

10

आप RuleChain उपयोग कर सकते हैं।

@Rule 
public TestRule chain= RuleChain.outerRule(new HadoopSingleNodeCluster()) 
          .around(new PigExternalResource()); 
+0

महान !!! कोड की एक पंक्ति के साथ मेरी समस्या हल हो गई है। धन्यवाद स्टीफन। –

+0

अच्छा! जाने के लिए 10 और ... –

1

क्यों आप अपने खुद के ExternalResource है कि आप नए संसाधन के before और after तरीकों के भीतर से की आवश्यकता होती है क्रम में before और after तरीकों कॉल में इन दो ExternalResources लपेट नहीं है।

उदाहरण:

public class MyResource extends ExternalResource{ 
    private final List<ExternalResource> beforeResources; 
    private final List<ExternalResource> afterResources; 

    public MyResource(List<ExternalResource> beforeResources, 
      List<ExternalResource> beforeResources){ 
    } 

     public void before(){ 
      for (ExternalResource er : beforeResources) 
       er.before(); 
     } 

     public void after(){ 
      for (ExternalResource er : afterResources) 
       er.after(); 
     } 
} 


public class TestPigExternalResource { 

// hadoop external resource, this should start first 
public HadoopSingleNodeCluster cluster = new HadoopSingleNodeCluster(); 

// pig external resourcem, this should wait until hadoop external resource starts 
public PigExternalResource pigExternalResource = new PigExternalResource(); 

    @Rule 
    public MyResource myResource = new MyResource(
      newArrayList(cluster, pigExternalResource), 
      newArrayList(cluster, pigExternalResource)); 
... 
} 
+0

धन्यवाद लेकिन मुझे लगता है कि विधि के पहले और बाद में @Rule एनोटेशन का उपयोग करने की अनुमति नहीं है। –

+0

पोस्ट में जोड़ा गया उदाहरण देखें। अन्य संसाधनों को नियमों के रूप में चिह्नित नहीं किया जाएगा क्योंकि उन्हें रैपिंग नियम में शामिल किया जाएगा। –

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