Berbagi kelas src / pengujian antar modul dalam proyek multi-modul maven

120

Saya memiliki proyek Maven multi-modul. Demi contoh ini, pertimbangkan dua modul:

  • data
  • consumer

Modul consumermemiliki modul datasebagai ketergantungan.

Modul datamendeklarasikan sekelompok kelas inti. Ada tes di bawah src/testyang menggunakannya. Tes ini memerlukan beberapa pembuatan objek bertele-tele, jadi saya memiliki kelas dengan beberapa metode utilitas di dalamnya untuk membuat objek ini. Kelas utilitas ini ( SampleDataHelper) ada dalam src/testhierarki.

Saya juga memiliki beberapa tes dalam consumermodul yang perlu membuat beberapa objek bertele-tele ini. Saya ingin menggunakan SampleDataHelperkelas saya (ditentukan dalam data src/test) dalam tes yang ada di consumer src/testpohon saya . Sayangnya, meskipun datamerupakan ketergantungan consumer, consumertidak dapat melihat kelas yang ada di bawah data src/test.

Untuk mengatasi ini, saya pikir saya mungkin membuat modul lain ( data-test), dan pindah SampleDataHelperke bawah src/main. Kemudian saya akan memasukkan data-testsebagai dependensi cakupan pengujiandata . Sayangnya, ini memperkenalkan ketergantungan melingkar: datapenggunaan data-test, tetapi data-testjuga membutuhkan data.

Satu-satunya solusi yang saya temukan adalah menempatkan SampleDataHelperdi data src/mainbawah sebuah testpaket dan berharap tidak ada kode aplikasi nyata yang memanggilnya.

Bagaimana saya bisa berbagi SampleDataHelperkelas saya antar modul tanpa meletakkannya di bawah src/main?

Greg Kopff
sumber
1
Lihat jawaban ini . Saya pikir itu akan membantu Anda.
Andrew Logvinov
7
Untuk pembaca mendatang: Panduan Maven untuk menggunakan tes terlampir
Greg Kopff
@AndrewLogvinov: bukankah jawaban tertaut Anda memerlukan pembuatan "dua langkah"? Untuk pertama-tama membangun dan menerapkan satu modul ( data) bahkan sebelum saya dapat mengompilasi modul kedua saya ( consumer).
Greg Kopff
Saya pikir Anda mungkin menemukan beberapa masalah jika Anda menggunakan mvn package, tetapi seharusnya berfungsi dengan baik dalam satu langkah membangun saat Anda menggunakan mvn installatau mvn deploy. Hanya catatan singkat. Dalam salah satu proyek besar kami, kami memiliki pembungkus di atas junit TestBasedan lokasinya di src/mainmana saya juga tidak menganggapnya sebagai ide yang baik.
Andrew Logvinov

Jawaban:

152

Proyek Konsumen Anda bergantung pada proyek Data Anda, oleh karena itu kami senang bahwa Data harus dibuat sebelum Konsumen. Akibatnya, dengan menggunakan teknik yang disarankan dalam komentar , saya akan memastikan proyek Data Anda berisi semua kode uji yang ingin Anda bagikan dan konfigurasi POM untuk menghasilkan JAR uji:

<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>

Proyek Konsumen Anda kemudian akan bergantung pada artefak Data JAR normal, ditambah test-jarartefak tambahan , dengan cakupan pengujian tentunya:

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

Saya telah menggunakan pendekatan ini pada banyak kesempatan dan berhasil dengan baik.

Duncan Jones
sumber
1
terkait "Proyek Konsumen Anda kemudian akan bergantung pada artefak Data JAR normal, ditambah bagian artefak tabung uji tambahan", saat saya menambahkan kedua dependensi data ke konsumen (misalkan artefak saya juga menamai data & konsumen) pom, tanpa spesifikasi versi tertentu, pom mengalami error. Mengapa itu terjadi?
Johnny
@StasS mungkin sebaiknya Anda membuka pertanyaan terpisah tentang itu.
Duncan Jones
1

Jadi masalahnya adalah (beberapa) tes dalam datamodul bergantung pada SampleDataHelperkelasnya? Anda dapat memindahkan SampleDataHelperkelas untuk src/mainsatu data-testmodul, jika Anda pada saat yang sama memindahkan tes (yang bergantung pada kelas khusus) untuk src/testsatu data-testmodul. Akibatnya, tidak akan ada lagi ketergantungan melingkar.

matsev
sumber
1
Jika saya memahami Anda, Anda menyarankan agar tes apa pun yang digunakan SampleDataHelperdipindahkan dari datamodul atau consumermodul (sebagaimana mestinya) ke data-test. Sayangnya saya tidak menemukan ini solusi yang sangat "rapi" karena memindahkan tes saya dari modul yang mereka uji, dan ke modul yang berbeda. (Sebenarnya, Anda hanya mengatakan untuk memindahkan datates, tetapi saya pikir saya akan menemukan diri saya menggerakkan keduanya untuk konsistensi). Tapi terima kasih atas jawabannya. :-)
Greg Kopff
1
Ya, Anda mengerti saya dengan benar. Dan bisa dibilang, ini lebih merupakan solusi cepat daripada solusi yang rapi. :-)
matsev
Saya membayangkan ketergantungan melingkar akan tetap ada. Dengan asumsi bahwa tes yang dimaksud menjalankan kelas yang ditentukan dalam proyek Data, masih perlu referensi kembali ke proyek Data dari proyek Data-Test.
Duncan Jones
1
@DuncanJones Maaf, ada kesalahan ketik kecil di postingan saya. Poin yang saya coba buat adalah bahwa data-testmodul harus bergantung pada datamodul (dan bukan sebaliknya). Untuk menghindari ketergantungan melingkar, semua pengujian yang saat ini berada di datamodul yang menggunakan SampleDataHelperharus dipindahkan ke data-testmodul.
matsev
Gotcha, itu lebih masuk akal.
Duncan Jones