7

テスト クラスで複数の外部リソースを使用したいのですが、外部リソースの順序付けに問題があります。

コード スニペットは次のとおりです。

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 が開始する前に pig を開始しようとするため、ローカルの Hadoop シングル ノード クラスターに接続できませんでした。

junitのルールを注文する方法はありますか?

ありがとう

4

3 に答える 3

11

RuleChainを使用できます。

@Rule
public TestRule chain= RuleChain.outerRule(new HadoopSingleNodeCluster())
                           .around(new PigExternalResource());
于 2013-10-24T16:33:45.710 に答える
1

これら 2 つを、新しいリソースのandメソッド内から必要な順序でandメソッドを呼び出すExternalResources独自にラップしてみませんか。ExternalResourcebeforeafterbeforeafter

例:

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));
 ...  
}
于 2013-10-04T10:30:31.613 に答える
1

JUnit 4.13-beta-1 には新しいorder属性が@Ruleあります。@ClassRule

@Ruleコードを参照してください:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface Rule {

    int DEFAULT_ORDER = -1;

    /**
     * Specifies the order in which rules are applied. The rules with a higher value are inner.
     *
     * @since 4.13
     */
    int order() default DEFAULT_ORDER;

}

参照用にこの PR も参照してください: PR-1445

于 2019-04-02T13:54:00.410 に答える