2009-11-25 19 views
8

No puedo ejecutar Powermock a través de maven. Soy PowerMock Mockito y PowerMockRunner para conducir una prueba jUnit.Ejecución de Junit y PowerMock con Mockito a través de PowerMockRunner de maven

Aquí está la prueba:

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

no he configurado anyting especial para ejecutar la prueba. Mi pom hace referencia a las siguientes definiciones:

  • org.mockito | mockito-todo | 1.8.0
  • junit | junit | 4.6.0
  • org.powermock.modules | powermock-module-junit4 | 1.3.1
  • org.powermock.api | powermock-api-mockito | 1.3.1

cuando ejecuto mvn -Dtest=AlertNotificationsTest test mvn dice que no hay prueba para ejecutar. Pero si ejecuto la misma clase de prueba de eclipse, todo funciona bien.

¿Estoy haciendo algo mal?


Aquí es mi pom.xml a continuación (las partes pertinentes)

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

Aquí está la salida del experto

mvn -Dtest = AlertNotificationsTest prueba

... 
[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: Puedo ejecutar otras pruebas, simplemente no puedo ejecutar esta prueba. Si hago que la clase AlertNotificationsTest extienda junit.framework.TestCase, la clase es recogida por maven, pero parece que no se maneja por PowerMockRunner.

Aquí está la salida de ese:


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 

Una vez más, estas pruebas se ejecutan muy bien con Eclipse.


actualización me encontré con un problema posible & solución. Tengo pruebas con TestNG y JUnit. Si elimino TestNG de mi pom y migro todas mis pruebas a JUnit, puedo ejecutar mi prueba de PowerMock con mvn test. Entonces parece que hay un problema con maven y el combo junit/testng.

Me gustaría poder ejecutar ambas cosas, pero si no encuentro la forma de hacerlo, responderé mi propia pregunta. Gracias chicos chicas &

+0

es la prueba (que no se extiende 'junit.framework.TestCase') activadas cuando acaba de ejecutar 'mvn test'? –

+0

No, no se activó. –

+0

Entonces ni siquiera esperes que sea cuando uses '-Dtest'. Tienes otro problema (y parece que encontraste la fuente). –

Respuesta

-1

Hubo un problema al mezclar las dos pruebas Test de TestNG & JUnit. La migración de todas las pruebas a Junit resolvió mi problema. Gracias chicos.

1

configuración Powermock ve bien a mí, y los frascos parecen bien (suponiendo dependencias transitivas maven obtienen los otros frascos powermock - que tenemos de 6-7 después de nuestra determinación de hiedra los sufran)

Eclipse podría estar usando su propia biblioteca JUnit "interna", por lo tanto, los diferentes comportamientos?

¿La prueba está anotada con org.junit. @ Test?

+0

Sí, las pruebas están anotadas con @ org.junit.Test –

2

No puedo reproducir su problema. Con el siguiente contenido en mi 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> 

Y la siguiente clase de prueba (se pierden las importaciones):

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

Correr mvn test -Dtest=AppTest solo funciona bien y me da el siguiente resultado:

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

Entonces la pregunta es: ¿tiene un método anotado con @Test en AlertNotificationsTest?

+0

Sí, tengo muchas pruebas anotadas con @ org.junit.Test. –

+0

Por favor, publique su 'pom.xml' luego. Como dije, no puedo reproducir el comportamiento que describes. Y, por cierto, ¿qué observas cuando ejecutas 'mvn test'? –

+0

Ha publicado lo que solicitó –

0

Si nos fijamos en el origen del plugin Surefire, hace algunas cosas furtivas. Si encuentra algún paquete TestNG en Classloader, optará por ejecutar TestNG TestRunner. Todavía no he visto ejemplos de pruebas tanto JUNit como TestNG que funcionen bien una al lado de la otra.

+0

Esto es posible con dos ejecuciones. –

2

Me encontré con este problema también, pero no es un problema de PowerMock. Mi clase de prueba se llamó XStaticTests.java.

Cuando ejecuto "mvn ensayo limpio", esta prueba no se presentaría, sólo corrió cuando se especifica la prueba usando "-Dtest = ..."

La documentación segura menciona que por defecto sólo estos patrones se buscan: "/Test_.java": incluye todos sus subdirectorios y todos los nombres de archivo de Java que comienzan con "Prueba". "/Test.java": incluye todos sus subdirectorios y todos los nombres de archivo de Java que terminan con "Prueba". " */* TestCase.java" - incluye todos sus subdirectorios y todos los nombres de archivo de Java que terminan con "TestCase".

Por lo tanto, al cambiar el nombre de clase por uno que finalice con uno de estos, se ejecutará cuando se llame a "mvn test", de lo contrario, el complemento surefire debe configurarse específicamente con el nombre de clase.

12

Acabo de tener este error y trabajé en la solución. Mi pom.xml tenía la siguiente dependencia:

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

El problema viene del hecho de que mi código utiliza JUnit y la dependencia anteriormente tiene una dependencia externa en TestNG. Esto impedía que mi prueba se ejecutara. Por qué no lo sé, ¡aunque hubiera pensado que un marco de prueba hubiera sido probado un poco mejor!

De todos modos la solución fue la de romper las dependencias 'completos' a solo aquellos requerido:

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

Eso lo resolvió. Por cierto, utilicé mvn dependency:tree para comprender las dependencias asociadas.

+0

Esta solución funcionó para mí. Estaba usando la versión Powermock 1.6.4 con Mockito 1.9.5. –

0

Tuve el mismo problema, y ​​me tomó un tiempo darme cuenta. Mi configuración estaba sacando una versión anterior de jboss.javassist, lo que extrañamente impedía que PowerMockRunner funcionara.

Vale la pena señalar que también tengo un entorno mixto JUnit/TestNG. Anteriormente probé la solución de agregar múltiples proveedores surefire, y eso tampoco funcionó (usando surefire 2.14.1). Después de actualizar a surefire 2.17, mis dos pruebas JUnit y TestNG comenzaron a ejecutarse sin necesidad de declarar ningún proveedor seguro.

Aquí está mi sección de 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> 

... y las pruebas pertinentes deps ...

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