2013-10-04 85 views
6

我想在我的測試類中使用多個外部資源,但是我對外部資源的排序有問題。Junit外部資源@規則

下面是代碼片段:

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的單節點集羣。

有什麼辦法可以排序junit規則嗎?

感謝

+0

「HadoopSingleNodeCluster」類是否公開?因爲我使用'org.apache.hadoop.mapred.ClusterMapReduceTestCase',但它並不那麼穩定。 –

+0

@nefo_x ** HadoopSingleNodeCluster **是我自己的類,在hadoop發行版中不可用。 –

+0

是基於一些現有的代碼庫嗎?我嘗試使用集羣映射減少測試用例,但它啓動外部JVM,並且在某些情況下調試有點困難。 –

回答

10

您可以使用RuleChain

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

太棒了!這是用一行代碼解決了我的問題。謝謝Stefan。 –

+0

不錯!還有10個去... –

1

你爲什麼不以自己ExternalResource調用在你新的資源的beforeafter方法中需要的順序beforeafter方法包裝這兩個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

查看已添加到帖子的示例。其他資源將不再被標記爲規則,因爲它們將包含在包裝規則中。 –