2013-10-04 5 views
6

Я хочу использовать несколько внешних ресурсов в своем тестовом классе, но у меня проблема с заказом внешних ресурсов.Junit External Resource @Rule Order

Вот фрагмент кода:

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

основан на какой-то существующей кодовой базе? Я пытаюсь использовать тестовый тест cluster mapreduce, но он запускает внешние JVM, и это немного сложно для отладки в некоторых случаях. –

ответ

10

Вы можете использовать RuleChain.

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

отлично !!! что решает мою проблему с помощью одной строки кода. Спасибо, Стефан. –

+0

Ницца! Еще 10 ... –

1

Почему вы не обернуть эти два 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)); 
... 
} 
+0

Спасибо, но я думаю, использование @Rule аннотации в до и после метода не допускается. –

+0

См. Пример, добавленный в сообщение. Другие ресурсы больше не будут помечены как правила, поскольку они будут включены в правило обертывания. –

Смежные вопросы