我想在我的测试类中使用多个外部资源,但是我对外部资源的排序有问题。
这是代码片段:
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规则?
谢谢
你可以使用RuleChain。
@Rule
public TestRule chain= RuleChain.outerRule(new HadoopSingleNodeCluster())
.around(new PigExternalResource());
你为什么不把这两个ExternalResources
包装在你自己的ExternalResource
中,它按照你需要的顺序在新资源的before
和after
方法中调用before
和after
方法。
例:
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));
...
}
在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。