Berbagi kode Uji di Maven

183

Bagaimana Anda bisa bergantung pada kode tes dari modul lain di Maven?

Contoh, saya punya 2 modul:

  • Mendasarkan
  • Utama

Saya ingin test case di Main untuk memperpanjang kelas tes basis di Base. Apakah ini mungkin?

Pembaruan: Menemukan jawaban yang dapat diterima , yang melibatkan pembuatan tabung percobaan.

menebal
sumber
1
Tampaknya jawaban yang setara dengan kombinasi dari jawaban yang diterima di bawah, yang sebenarnya merupakan catatan pada jawaban yang lebih besar di bawah, sekarang di situs Maven: Cara membuat tabung berisi kelas tes
David Tonhofer

Jawaban:

189

Saya sarankan menggunakan tipe bukan classifier (lihat juga: classifier ). Ini memberi tahu Maven sedikit lebih eksplisit apa yang Anda lakukan (dan saya telah menemukan bahwa m2eclipse dan q4e keduanya lebih menyukainya).

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>
Ben
sumber
5
Haruskah ada entri dependensi terpisah untuk com.myco.app khusus untuk jenis test-jar?
Noah Watkins
20
Juga ingat untuk menambahkan test-jar ke konfigurasi maven-jar-plugin: maven.apache.org/guides/mini/guide-attached-tests.html
user1338062
11
Saya bingung ketika pertama kali membaca jawaban ini ... Itu sebenarnya karena itu tidak masuk akal sendiri, Anda harus terlebih dahulu membaca jawaban di bawah ini: stackoverflow.com/questions/174560/…
TanguyP
179

Terima kasih atas saran modul dasar. Namun, saya lebih suka tidak membuat modul baru hanya untuk tujuan ini.

Menemukan jawaban yang dapat diterima dalam dokumentasi Surefire Maven dan sebuah blog . Lihat juga " Cara membuat tabung berisi kelas tes ".

Ini menciptakan file jar kode dari src/test/javamenggunakan plugin jar sehingga modul dengan tes dapat berbagi kode.

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

Untuk menggunakan JAR tes terlampir yang dibuat di atas, Anda cukup menentukan ketergantungan pada artifak utama dengan pengelompokan tes yang ditentukan:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project> 
menebal
sumber
14
Perhatikan, bahwa mungkin ada masalah dengan menggunakan tes <classifier> </ classifier dalam dependensi. Sebagai gantinya, gunakan <type> test-jar </type>. Berikut adalah satu masalah di Maven jira.codehaus.org/browse/MNG-2045 dan yang tidak terkait di IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit
Ini sangat berguna bagi saya, tetapi saya telah menemukan masalah: Ketika saya menjalankan "install -Dmaven.test.skip = true", juga ketergantungan test-jar diperlukan dan proses gagal
Javi Pedrera
@JaviPedrera berfungsi untuk saya walaupun saya melakukan 'mvn clean install -DskipTests = true' dan test-jar akan dibuat. tidak ada kesalahan
Karussell
1
@ Allen sudahkah Anda memastikan bahwa Anda menggunakan ServiceResultTransformer saat mengemas toples Anda? Kalau tidak, Anda akan berakhir dengan file layanan yang saling menimpa.
jontejj
1
maven.apache.org/plugins/maven-shade-plugin/examples/… di sana Anda dapat membaca lebih lanjut tentang itu.
jontejj
12

Kami menyelesaikan ini dengan membuat proyek pakar dengan kode uji sebagai src / main / java dan menambahkan ketergantungan berikut ke proyek:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>
sal
sumber
Ya, itu akan berhasil, terima kasih! Lihat komentar saya di bawah untuk jawaban alternatif yang saya sukai.
Panaskan
1
Kami menggunakan pendekatan ini juga, agak konyol Anda terpaksa pergi untuk pengklasifikasi atau tipe (yang hampir tidak dasar di Maven untuk sebagian besar pengguna) dan bahwa Anda harus membangun JAR dengan beberapa upaya ketika Anda tidak benar-benar membutuhkan atau - seperti dalam kasus ini - Anda memiliki kode non-tes de-facto sebagai basis hanya untuk kode tes.
virgo47
-3

Yap ... sertakan saja modul Base sebagai dependensi di Main. Jika Anda hanya mewarisi kode uji, maka Anda dapat menggunakan tag lingkup untuk memastikan Maven tidak memasukkan kode dalam artefak Anda saat digunakan. Sesuatu seperti ini seharusnya bekerja:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Steve Moyer
sumber