Codice test di condivisione in Maven


183

In che modo puoi dipendere dal codice di test di un altro modulo in Maven?

Esempio, ho 2 moduli:

  • Base
  • Principale

Vorrei un caso di test in Main per estendere una classe di test di base in Base. È possibile?

Aggiornamento: trovata una risposta accettabile , che prevede la creazione di un vaso di prova.


1
Sembra una risposta equivalente alla combinazione della risposta accettata di seguito, che in realtà è una nota sulla risposta più ampia più avanti di seguito, è ora sul sito Maven: Come creare un vaso contenente classi di prova
David Tonhofer

Risposte:


189

Consiglio di usare il tipo anziché il classificatore (vedi anche: classificatore ). Spiega a Maven un po 'più esplicitamente cosa stai facendo (e ho scoperto che a m2eclipse e q4e piace sia meglio).

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

5
Dovrebbe esserci una voce di dipendenza separata per com.myco.app appositamente per il tipo test-jar?
Noah Watkins,

20
Ricorda anche di aggiungere test-jar alla configurazione del plugin maven
user1338062

11
Ero confuso quando prima lettura questa risposta ... Che in realtà è perché non ha senso di per sé, si deve prima leggere la risposta di seguito: stackoverflow.com/questions/174560/...
TanguyP

179

Grazie per il suggerimento sul modulo base. Tuttavia, preferirei non creare un nuovo modulo proprio per questo scopo.

Ho trovato una risposta accettabile nella documentazione di Surefire Maven e in un blog . Vedi anche " Come creare un vaso contenente classi di test ".

Questo crea file jar di codice src/test/javadall'uso del plugin jar in modo che i moduli con i test possano condividere il codice.

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

Per utilizzare il JAR di test allegato creato sopra, è sufficiente specificare una dipendenza dal manufatto principale con un classificatore di test specificato:

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

14
Si noti che potrebbero esserci problemi con l'utilizzo di <classifier> test </ classificatore nella dipendenza. Invece, usa <type> test-jar </type>. Ecco un numero in Maven jira.codehaus.org/browse/MNG-2045 e uno non correlato in IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit

Mi è stato molto utile, ma ho riscontrato un problema: quando eseguo "install -Dmaven.test.skip = true", è richiesto anche il vaso di test delle dipendenze e il processo fallisce
Javi Pedrera

@JaviPedrera funziona per me anche se faccio 'mvn clean install -DskipTests = true' e verrà creato il test-jar. nessun errore
Karussell,

1
@Tutti ti sei assicurato di utilizzare il ServiceResultTransformer mentre impacchettavi il tuo barattolo? Altrimenti potresti finire per sovrascrivere i file di servizio.
jontejj,


12

Abbiamo risolto questo problema realizzando un progetto maven con codice di test come src / main / java e aggiungendo la seguente dipendenza ai progetti:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>

Sì, funzionerebbe, grazie! Vedi il mio commento qui sotto per la risposta alternativa che preferisco.
sfarfallio

1
Usiamo anche questo approccio, è un po 'sciocco che sei costretto a cercare classificatori o tipi (che sono quasi fondamentali in Maven per la maggior parte degli utenti) e che devi costruire JAR con un certo sforzo quando non hai davvero bisogno oppure - come in questo caso - hai di fatto un codice non di prova come base solo per il codice di prova.
virgo47,

-3

Sì ... basta includere il modulo Base come dipendenza in Main. Se stai ereditando solo il codice di test, puoi utilizzare il tag scope per assicurarti che Maven non includa il codice nel tuo artefatto quando viene distribuito. Qualcosa del genere dovrebbe funzionare:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.