2013-10-04 87 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

查看已添加到帖子的示例。其他资源将不再被标记为规则,因为它们将包含在包装规则中。 –