2013-10-04 12 views
6

Test sınıfımda birden fazla harici kaynak kullanmak istiyorum, ancak dış kaynakların siparişinde sorun yaşıyorum.Junit Harici Kaynak @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(); 

    ... 
} 

sorun bu nedenle yerel Hadoop tek düğümlü bir küme bağlanamadı, bu Hadoop başlamadan önce domuz başlatmaya çalışır geçerli:

İşte kod pasajıdır.

Junit kurallarını sipariş etmenin herhangi bir yolu var mı? Eğer yeni kaynağın before ve after yöntemlerle içinden gerektiren sırayla before ve after yöntemlerini çağırır ExternalResource Kendi içinde bu iki ExternalResources sarmak yok Neden

sayesinde

+0

'HadoopSingleNodeCluster' sınıfı herkese açık olarak kullanılabilir mi? 'Org.apache.hadoop.mapred.ClusterMapReduceTestCase' kullandığım gibi, ancak bu kararlı değil. –

+0

@nefo_x ** HadoopSingleNodeCluster ** kendi sınıfım, hadoop dağıtımında mevcut değil. –

+0

bazı mevcut kod tabanına dayanıyor mu? Küme mapreduce testcase'yi kullanmaya çalışıyorum, ancak harici JVM'leri başlatıyor ve bu bazı durumlarda hata ayıklama için biraz zor. –

cevap

10

Sen RuleChain kullanabilirsiniz.

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

harika! Bu, tek bir kod satırıyla problemimi çözdü. Sağol Stefan. –

+0

Güzel! Gitmek için 10 tane daha ... –

1

.

Örnek:

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

Teşekkürler ama tahmin etmeden önce ve sonra @ Açıklama açıklamasını kullanıyorum. –

+0

Görmek için eklenen örnek bakınız. Diğer kaynaklar artık sarma kuralına dahil edileceğinden kural olarak işaretlenmeyecekti. –