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

您为什么不将这两个包装ExternalResources在您自己的中,按照您在新资源和方法中所需的顺序调用ExternalResourcebefore方法。afterbeforeafter

例子:

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 回答