2010-05-26 6 views
9

Come si rende disponibile manifest durante un'esecuzione di test Mavn/Surefire unittest "mvn test"?Come faccio a rendere disponibile manifest durante un'esecuzione di test di Mavn/Surefire unittest "mvn test"?

Ho un progetto open-source che sto convertendo da Ant a Maven, compresi i suoi test di unità. Ecco il repository del progetto sorgente con il progetto Maven: http://github.com/znerd/logdoc

La mia domanda riguarda il modulo principale, chiamato "base". Questo modulo ha un test unitario che verifica il comportamento del metodo statico getVersion() nella classe org.znerd.logdoc.Library. Questo metodo restituisce:

Library.class.getPackage().getImplementationVersion() 

Il metodo getImplementationVersion() restituisce un valore di un'impostazione nel file manifesto. Fin qui tutto bene. Ho provato questo in passato e funziona bene, purché manifest sia effettivamente disponibile sul classpath sul percorso META-INF/MANIFEST.MF (sul file system o all'interno di un file JAR).

Ora la mia sfida è che il file manifesto non è disponibile quando si esegue i test di unità:

mvn test 

infallibile esegue i test di unità, ma la mia unit test fallisce con un mesage che indica che Library.getVersion() restituito null.

Quando voglio controllare il JAR, trovo che non è stato nemmeno generato. Maven/Surefire esegue i test unitari contro le classi, prima dello le risorse vengono aggiunte al classpath.

Ulteriori indagini dimostra infallibile genera il proprio file JAR in una directory temporanea, ad esempio,

/private/var/folders/TR/TREvj1wIHYyAcUy-xmc3UU+++TI/-Tmp-/surefirebooter7448562488934426857.jar 

E quindi utilizza questo JAR per caricare la classe Library. Questo JAR non contiene le risorse che ho bloccato sotto src/main/resources. Quindi, anche il file META-INF/MANIFEST.MF non funziona.

Quindi, come faccio a comunicare a Surefire di avere il mio file META-INF/MANIFEST.MF disponibile dallo stesso caricatore classe della classe Library.

Nota che uso Maven 2.2.0, Java 1.6.0_17 su Mac OS X 10.6.2, con JUnit 4.8.1.

risposta

2

Bene, come è stato evidenziato, il problema è che il MANIFEST.MF si genera durante package e direttamente inclusi nel vaso finale e tutto questo avviene dopo test. Quindi credo che si dovrà o:

  • forniscono your own MANIFEST.MF (che sarebbe disponibile in target/classes prima di essere fusa durante package). Non so se questa è un'opzione (e se funzionerà).
  • metti ed esegui il test da un altro modulo a seconda del JAR.
+0

Pascal, la ringrazio molto per la risposta.Ho provato entrambi: Quando aggiungo un file src/main/resources/META-INF/MANIFEST.MF e corro mvn clean test quindi il file viene copiato su target/classes/META-INF/MANIFEST.MF, ma è ancora apparentemente non accessibile al test dell'unità. Quando utilizzo il JAR da un altro modulo all'interno dello stesso progetto, il JAR non viene utilizzato, ma la directory delle classi generate. Ho creato issue report SUREFIRE-620 per questo. –

+0

@Ernst Beh, non ho aiutato ma tu sei il benvenuto :) Avevo un grosso dubbio sulla prima soluzione, ma sembra che io fossi troppo fiducioso per il secondo. Grazie per aver pubblicato il numero di Jira, è un caso interessante. –

+0

Ho fatto qualche altra indagine e ho aggiornato la domanda. Farò qualche altra ricerca. Forse un tipo di istruzione "trova-ulteriore-classe-percorso-qui" funzionerà. –

Problemi correlati