2013-10-04 12 views
6

テストクラスで複数の外部リソースを使用したいが、外部リソースの順序付けに問題がある。Junit外部リソース@Rule Order

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のルールを注文する方法はありますか?あなたが新しいリソースのbeforeafterメソッド内から必要な順序でbeforeafterメソッドを呼び出すことExternalResource自分自身でこれらの2 ExternalResourcesをラップしていないのはなぜ

おかげ

+0

'HadoopSingleNodeCluster'クラスは一般に公開されていますか?私は 'org.apache.hadoop.mapred.ClusterMapReduceTestCase'を使用していますが、安定していません。 –

+0

@nefo_x ** HadoopSingleNodeCluster **は私自身のクラスで、ハープの配布では利用できません。 –

+0

は既存のコードベースに基づいていますか?私はクラスターのmapreduceテストケースを使用しようとしますが、外部JVMを起動しますが、それは場合によってはデバッグに少し難しいです。 –

答えて

10

あなたはRuleChainを使用することができます。

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

素晴らしい!それは私の問題を1行のコードで解決しています。ステファンありがとう。 –

+0

ニース!もっと行く10 ... –

1

例:

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

掲載の例を掲載しています。他のリソースは、ラッピング規則に含まれるため、ルールとしてマークされなくなりました。 –

関連する問題