2009-11-25 17 views
8

Non riesco a eseguire Powermock tramite Maven. Sono il PowerMock Mockito e PowerMockRunner per aver guidato un test di jUnit.Esecuzione di Junit e PowerMock con Mockito tramite PowerMockRunner di Maven

Ecco il test:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ UserLocalServiceUtil.class, ExpandoBridge.class }) 
public class AlertNotificationsTest { 
//... 

non ho configurato anyting speciale per l'esecuzione del test. Il mio pom fa riferimento ai seguenti punti:

  • org.mockito | mockito-tutto | 1.8.0
  • junit | unità | 4.6.0
  • org.powermock.modules | powermock-module-junit4 | 1.3.1
  • org.powermock.api | powermock-api-mockito | 1.3.1

quando corro mvn -Dtest=AlertNotificationsTest test mvn dice che non c'è alcun test da eseguire. Ma se eseguo la stessa classe di test da Eclipse, tutto funziona correttamente.

Sto facendo qualcosa di sbagliato?


Ecco la mia pom.xml di seguito (le parti pertinenti)

<dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>5.9</version> 
     <classifier>jdk15</classifier> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.6</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.8.0</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock.modules</groupId> 
     <artifactId>powermock-module-junit4</artifactId> 
     <version>1.3.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock.api</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <version>1.3.1</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

Ecco l'output di Maven

mvn -Dtest = AlertNotificationsTest prova

... 
[INFO] Surefire report directory: C:\Devel\Java\EP_PORTAL\information-provider\target\surefi 

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running TestSuite 
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.313 sec 

Results : 

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 

[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] No tests were executed! (Set -DfailIfNoTests=false to ignore this error.) 
[INFO] ------------------------------------------------------------------------ 

Nota: Posso eseguire altri test, non riesco a eseguire questo test. Se faccio sì che la classe AlertNotificationsTest estenda junit.framework.TestCase, la classe viene rilevata da Maven, ma sembra che non venga guidata da PowerMockRunner.

ecco l'output di che:


Running TestSuite 
[ERROR]: No test suite found. Nothing to run 
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 1.053 sec <<< FAILURE! 

Results : 

Failed tests: 
    testSingleEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest) 
    testTwoEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest) 

Tests run: 4, Failures: 2, Errors: 0, Skipped: 0 

Ancora una volta, questi test girare bene con Eclipse.


Aggiornamento ho trovato un possibile problema & soluzione. Ho dei test con TestNG e JUnit. Se rimuovo TestNG dal mio pom e trasferisco tutti i miei test su JUnit, sono in grado di eseguire il test PowerMock con mvn test. Quindi sembra che ci sia un problema con maven e la combinazione junit/testng.

Mi piacerebbe essere in grado di eseguire entrambi, ma se non trovo un modo, andrò a rispondere alla mia stessa domanda. Grazie ragazzi & ragazze

+0

è la prova (che non si estende 'junit.framework.TestCase') innescato quando esegui semplicemente 'mvn test'? –

+0

No, non è attivato. –

+0

Quindi non aspettatevi nemmeno che sia quando si usa '-Dtest'. Hai un altro problema (e sembra che tu abbia trovato la fonte). –

risposta

-1

Si è verificato un problema durante il missaggio dei test JUnit di TestNG &. La migrazione di tutti i test a Junit ha risolto il mio problema. Grazie ragazzi.

1

configurazione Powermock sembra ok per me, ei vasi sembrano bene (assumendo Maven dipendenze transitive ottengono gli altri barattoli powermock - abbiamo circa 6-7 dopo la nostra determinazione edera li manifestino)

Eclipse potrebbe usare la propria libreria JUnit "interna", quindi i diversi comportamenti?

Il test è annotato con org.junit. @ Test?

+0

Sì, i test sono annotati con @ org.junit.Test –

2

Non riesco a riprodurre il problema. Con il seguente contenuto nel mio pom.xml:

<repositories> 
    <repository> 
     <id>powermock-repo</id> 
     <url>http://powermock.googlecode.com/svn/repo/</url> 
    </repository> 
    </repositories> 
    <properties> 
    <powermock.version>1.3.1</powermock.version> 
    </properties> 
    <dependencies> 
    <dependency> 
     <groupId>org.powermock.modules</groupId> 
     <artifactId>powermock-module-junit4</artifactId> 
     <version>${powermock.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock.api</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <version>${powermock.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.6</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.8.0</version> 
    </dependency> 
    </dependencies> 

E la seguente classe di test (saltando le importazioni):

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ App.class }) 
public class AppTest { 
    @Test 
    public void testApp() { 
     assertTrue(true); 
    } 
} 

Esecuzione mvn test -Dtest=AppTest solo funziona bene e mi danno il seguente output:

 
... 
------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.mycompany.app.AppTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.135 sec 

Results : 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3 seconds 
[INFO] Finished at: Wed Nov 25 17:34:32 CET 2009 
[INFO] Final Memory: 9M/79M 
[INFO] ------------------------------------------------------------------------ 

Quindi la domanda è: avete un metodo annotato con @Test in AlertNotificationsTest?

+0

Sì, ho un sacco di test annotati con @ org.junit.Test. –

+0

Per favore pubblica il tuo 'pom.xml' allora. Come ho detto, non posso riprodurre il comportamento che descrivi. E BTW, cosa osservi quando esegui 'mvn test'? –

+0

Sono stati pubblicati i dati richiesti –

0

Se si guarda alla fonte del plug-in Surefire, si tratta di qualcosa di subdolo. Se trova qualsiasi pacchetto TestNG nel Classloader, sceglierà di eseguire TestNG TestRunner. Non ho ancora visto alcun esempio di entrambi i test di JUNit e TestNG che funzionano bene fianco a fianco.

+0

Ciò è possibile utilizzando due esecuzioni. –

2

Mi sono imbattuto in questo problema, ma non è un problema di PowerMock. La mia classe di test è stata denominata XStaticTests.java.

Quando eseguo "mvn prova pulita", questo test non correrebbe, ha funzionato solo quando ho specificato il test utilizzando "-Dtest = ..."

La documentazione infallibile menziona il fatto che per impostazione predefinita solo questi modelli cercato: "/Test*.java" - include tutte le sue sottodirectory e tutti i nomi di file java che iniziano con "Test". "/Test.java" - include tutte le sue sottodirectory e tutti i nomi di file java che terminano con "Test". " */* TestCase.java" - include tutte le sue sottodirectory e tutti i nomi di file java che terminano con "TestCase".

Pertanto, la modifica del nome di classe in uno che termina con uno di questi, verrà eseguita quando viene chiamato "mvn test", altrimenti il ​​plugin surefire deve essere configurato con il nome della classe in modo specifico.

12

Ho appena avuto questo errore e ho lavorato attraverso la soluzione. Il mio file pom.xml aveva la seguente dipendenza:

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-mockito-release-full</artifactId> 
    <version>1.5</version> 
    <classifier>full</classifier> 
    <scope>test</scope> 
</dependency> 

Il problema deriva dal fatto il mio codice utilizza JUnit e il sopra dipendenza è una dipendenza esterna in TestNG. Questo stava fermando il mio test dalla corsa. Perché non lo so - avresti anche se un framework di test sarebbe stato testato un po 'meglio !!!

In ogni caso la soluzione era quella di abbattere le dipendenze 'pieno' a poco quelli richiesti:

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-api-mockito</artifactId> 
    <version>1.5</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-core</artifactId> 
    <version>1.5</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4</artifactId> 
    <version>1.5</version> 
    <scope>test</scope> 
</dependency> 

che ha risolto esso. BTW Ho usato mvn dependency:tree per capire le dipendenze associate.

+0

Questa soluzione ha funzionato per me. Stavo usando la versione 1.6.4 di Powermock con Mockito 1.9.5. –

0

Ho avuto lo stesso problema e mi ci è voluto un po 'per capire. Il mio setup stava introducendo una versione precedente di jboss.javassist, che stranamente impediva a PowerMockRunner di funzionare.

Vale la pena notare che ho anche un ambiente misto JUnit/TestNG. Ho già provato la soluzione di aggiungere più provider di surefire, e non ha funzionato neanche (usando surefire 2.14.1). Dopo l'aggiornamento a surefire 2.17, entrambi i miei test JUnit e TestNG sono stati avviati senza dover dichiarare alcun provider di surefire.

Ecco la mia sezione plug-in ...

 <plugin> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.17</version> 
      <configuration> 
       <groups>spring, unit, integration</groups> 
       <systemPropertyVariables> 
        <java.awt.headless>true</java.awt.headless> 
        <org.apache.activemq.default.directory.prefix>target/test/</org.apache.activemq.default.directory.prefix> 
        <log4j.configuration>file:${project.basedir}/src/test/resources/log4j.properties</log4j.configuration> 
       </systemPropertyVariables> 
       <argLine>${surefire.args}</argLine> 
      </configuration> 
     </plugin> 

... e le relative dipendenze di test ...

<dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.9.5</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- 
    PowerMock versions are compatible with specific Mockito versions. 
    https://code.google.com/p/powermock/wiki/MockitoUsage13 
    --> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4</artifactId> 
     <version>1.5.4</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <version>1.5.4</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- without this PowerMock tests don't run in maven --> 
    <dependency> 
     <groupId>jboss</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.8.0.GA</version> 
     <scope>test</scope> 
    </dependency> 
Problemi correlati