Çok modüllü bir maven projesinde modüller arasında src / test sınıflarını paylaşma


120

Çok modüllü bir Maven projem var. Bu örnek için iki modülü düşünün:

  • data
  • consumer

Modül consumer, databağımlılık olarak modüle sahiptir .

Modül data, bir grup çekirdek sınıf bildirir. src/testBunların altında onları kullanan testler var . Bu testler bazı uzun soluklu nesne oluşturma gerektirir, bu yüzden bu nesneleri oluşturmak için içinde bazı yardımcı yöntemlerin bulunduğu bir sınıfım var. Bu yardımcı program sınıfı ( SampleDataHelper) src/testhiyerarşi içindedir.

Ayrıca consumermodülde bu uzun soluklu nesnelerden bazılarını yaratmam gereken bazı testlerim var . Ağacımda bulunan testlerde SampleDataHelpersınıfımı (içinde tanımlanan data src/test) kullanmak istiyorum consumer src/test. Ne yazık ki, olsa bile databir bağımlılık olduğunu consumer, consumeraltında var sınıfları göremiyorum data src/test.

Bununla mücadele etmek için başka bir modül ( data-test) oluşturup SampleDataHelperaltına taşıyabileceğimi düşündüm src/main. Sonra yer alacağını data-testbir şekilde test kapsamı içinde bağımlılık data. Ne yazık ki, bu döngüsel bir bağımlılık getiriyor: datakullanımlar data-test, ancak data-testaynı zamanda gerektirir data.

Ben ile geldim tek çözüm yerine etmektir SampleDataHelperaltında data src/mainbir alt testpaketi ve hiçbir gerçek uygulama kodu Hiç çağırır umut.

Nasıl paylaşabilir SampleDataHelpermodülleri arasında sınıf olmadan altına aldıktan sonra src/main?


1
Check out bu cevabı . Sanırım sana yardımcı olmalı.
Andrew Logvinov

7
Gelecekteki okuyucular için: Ekli testleri kullanma Maven Kılavuzu
Greg Kopff

@AndrewLogvinov: Bağlı cevabınız "iki aşamalı" bir yapı gerektirmez mi? İlk inşa ve To dağıtma tek modül ( data) Hatta benim ikinci modülü derlemek için önce ( consumer).
Greg Kopff 13

Ne düşündüğünü olabilir kullanırsanız bazı sorunlar rastlamak mvn package, ancak kullandığınızda tek adımlı yapı sadece para cezası çalışmalıdır mvn installveya mvn deploy. Sadece hızlı bir not. Büyük projelerimizden birinde junit'in üzerine bir paketleyicimiz var TestBaseve bu src/mainbenim de iyi bir fikir olmadığını düşündüğüm bir yerde bulunuyor.
Andrew Logvinov

Yanıtlar:


152

Tüketici projeniz Veri projenize bağlıdır, bu nedenle Verilerin Tüketiciden önce oluşturulması gerektiğinden mutluyuz. Sonuç olarak, yorumlarda önerilen teknikleri kullanarak, Veri projenizin paylaşmak istediğiniz tüm test kodunu içermesini ve bir test JAR'ı oluşturmak için POM'u yapılandırmasını sağlayabilirim:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Tüketici projeniz daha sonra hem normal Data JAR yapısına hem de ek test-jaryapıtına bağlı olacaktır ve tabii ki test kapsamı:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

Bu yaklaşımı birçok durumda kullandım ve iyi çalışıyor.


1
"Tüketici projeniz daha sonra, verilerin her iki bağımlılığını da tüketiciye eklediğimde hem normal Data JAR yapısına hem de ek test kavanozu yapısına bağlı olacaktır (diyelim ki yapay nesnelerimin adı veri ve tüketici) pom, belirli sürüm özellikleri olmadan, pom hata aldı. Bu neden oluyor?
Johnny

@StasS muhtemelen bununla ilgili ayrı bir soru açsanız iyi olur.
Duncan Jones


1

Öyleyse sorun şu ki, datamodüldeki (bazı) testler SampleDataHelpersınıfa bağlı mı? Sen taşıyabilirsiniz SampleDataHelperiçin sınıf src/mainiçinde data-testaynı anda size (belirli bir sınıfa bağlıdır) testleri taşırsanız, modülün src/testiçinde data-testmodül. Sonuç olarak, artık döngüsel bağımlılıklar olmayacaktır.


1
Sizi anlarsam, kullanılan tüm testlerin modülden veya modülden (uygun şekilde) içine SampleDataHelpertaşınmasını öneriyorsunuz . Ne yazık ki, testlerimi test ettikleri modülden farklı bir modül içine taşıdığı için bunu çok "düzgün" bir çözüm bulmuyorum. (Açıkça söylemek gerekirse, sadece testleri kaldırmamı söyledin , ama tutarlılık için kendimi ikisini de hareket ettirirken bulacağımı düşünüyorum). Ama cevabın için teşekkürler. :-)dataconsumerdata-testdata
Greg Kopff 13

1
Evet, beni doğru anladın. Ve tartışmasız, temiz bir çözümden çok hızlı bir çözüm. :-)
matsev

Döngüsel bağımlılıkların devam edeceğini düşünürdüm. Söz konusu testlerin Veri projesinde tanımlanan sınıfları uyguladığını varsayarsak, yine de Veri-Test projesinden Veri projesine bir referans olması gerekir.
Duncan Jones,

1
@DuncanJones Üzgünüm, yazımda küçük bir yazım hatası var. Yapmaya çalıştığım nokta, data-testmodülün modüle bağlı olması gerektiğidir (tersi datadeğil). Döngüsel bağımlılıktan kaçınmak için, şu anda datamodülün kullanıldığı modülde bulunan tüm testler modüle SampleDataHelpertaşınmalıdır data-test.
matsev

Yakaladım, bu daha mantıklı.
Duncan Jones,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.