Condivisione di classi src / test tra i moduli in un progetto maven multi-modulo


120

Ho un progetto Maven multi-modulo. Per il bene di questo esempio, considera due moduli:

  • data
  • consumer

Il modulo consumerha il modulo datacome dipendenza.

Il modulo datadichiara un mucchio di classi principali. Ci sono test sotto src/testche li usano. Questi test richiedono una creazione di oggetti prolissa, quindi ho una classe con alcuni metodi di utilità per creare questi oggetti. Questa classe di utilità ( SampleDataHelper) è nella src/testgerarchia.

Ho anche alcuni test nel consumermodulo che devono creare alcuni di questi oggetti prolissi. Voglio usare la mia SampleDataHelperclasse (definita in data src/test) nei test che risiedono nel mio consumer src/testalbero. Purtroppo, anche se dataè una dipendenza diconsumer , consumernon è possibile vedere le classi che esistono sotto data src/test.

Per combattere questo, ho pensato di creare un altro module ( data-test) e spostarmi SampleDataHelpersu di esso in src/main. Quindi includerei data-testcome dipendenza dell'ambito del test di data. Sfortunatamente, questo introduce una dipendenza circolare: datausa data-test, ma data-testrichiede anche data.

L'unica soluzione che ho trovato è posizionare SampleDataHelper sotto data src/mainsotto un testpacchetto e la speranza che nessun codice reale applicazione mai lo chiama.

Come posso condividere la mia SampleDataHelperclasse tra i moduli senza inserirla src/main?


1
Dai un'occhiata a questa risposta . Penso che dovrebbe aiutarti.
Andrew Logvinov


@AndrewLogvinov: la tua risposta collegata non richiederebbe una build "in due fasi"? Per prima cosa costruire e distribuire un modulo ( data) prima ancora di poter compilare il mio secondo modulo ( consumer).
Greg Kopff

Penso che potresti incontrare alcuni problemi se usi mvn package, ma dovrebbe funzionare bene in un singolo passaggio quando usi mvn installo mvn deploy. Solo una breve nota. In uno dei nostri grandi progetti abbiamo un wrapper su junit TestBasee si trova in src/maincui non considero nemmeno una buona idea.
Andrew Logvinov

Risposte:


152

Il tuo progetto Consumer dipende dal tuo progetto Data, quindi siamo felici che i dati debbano essere creati prima di Consumer. Di conseguenza, utilizzando le tecniche suggerite nei commenti , mi assicurerei che il tuo progetto Data contenga tutto il codice di test che desideri condividere e configurare il POM per produrre un JAR di prova:

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

Il tuo progetto Consumer dipenderà quindi sia dal normale artefatto JAR di dati, sia dall'elemento aggiuntivo test-jar, con l'ambito del test ovviamente:

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

Ho usato questo approccio in molte occasioni e funziona bene.


1
per quanto riguarda "Il tuo progetto Consumer dipenderebbe sia dal normale artefatto JAR di dati, sia dalla parte aggiuntiva di test-jar artefatto", quando aggiungo entrambe le dipendenze dei dati nel consumatore (diciamo anche i miei artefatti denominati dati e consumatore) pom, senza specifiche versioni specifiche, il pom ha ricevuto un errore. Perché è successo?
Johnny

@StasS probabilmente è meglio che tu apra una domanda separata su questo.
Duncan Jones


1

Quindi il problema è che (alcuni) test nel datamodulo dipendono dalla SampleDataHelperclasse? Puoi spostare la SampleDataHelperclasse a src/maindel data-testmodulo, se contemporaneamente sposti i test (che dipendono dalla classe specifica) a src/testdel data-testmodulo. Di conseguenza, non ci sarebbero più dipendenze circolari.


1
Se ti capisco, stai suggerendo di SampleDataHelperspostare tutti i test che utilizzano dal datamodulo o dal consumermodulo (a seconda dei casi) a data-test. Sfortunatamente non trovo questa una soluzione molto "pulita" in quanto sposta i miei test fuori dal modulo che provano e in uno diverso. (A rigor di termini, hai solo detto di spostare i datatest, ma penso che mi troverei a spostare entrambi per coerenza). Ma grazie per la tua risposta. :-)
Greg Kopff

1
Sì, mi hai capito bene. E probabilmente, è più una soluzione rapida che accurata. :-)
matsev

Immagino che le dipendenze circolari rimarrebbero. Supponendo che i test in questione esercitino le classi definite nel progetto Data, ci sarebbe ancora bisogno di un riferimento al progetto Data dal progetto Data-Test.
Duncan Jones

1
@ DuncanJones Scusa, c'è stato un piccolo errore di battitura nel mio post. Il punto che sto cercando di sottolineare è che il filedata-test modulo dovrebbe dipendere dal datamodulo (e non viceversa). Per evitare la dipendenza circolare, tutti i test che attualmente risiedono nel datamodulo che utilizza il SampleDataHelperdevono essere spostati nel data-testmodulo.
matsev

Gotcha, questo ha più senso.
Duncan Jones
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.