Junit外部资源@Rule订单

问题描述 投票:7回答:3

我想在我的测试类中使用多个外部资源,但是我对外部资源的排序有问题。

这是代码片段:

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规则?

谢谢

java hadoop junit apache-pig rule
3个回答
10
投票

你可以使用RuleChain

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

1
投票

你为什么不把这两个ExternalResources包装在你自己的ExternalResource中,它按照你需要的顺序在新资源的beforeafter方法中调用beforeafter方法。

例:

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
投票

在JUnit 4.13-beta-1中,@Rule@ClassRule中有一个新的order属性。

请参阅@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

© www.soinside.com 2019 - 2024. All rights reserved.