No se puede ejecutar la prueba JUnit con PowerMockRunner


Tengo un proyecto Java basado en Gradle donde ahora quiero burlarme de un método privado usando PowerMock. El problema es que no puedo usar el PowerMockRunner ya que siempre obtengo la siguiente excepción cuando agrego la anotación @RunWith(org.powermock.modules.junit4.PowerMockRunner.class).

Error:

org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.
at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:581)
at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:308)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate TestMethods(PowerMockJUnit4MethodValidator.java:79)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate InstanceMethods(PowerMockJUnit4MethodValidator.java:49)
at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:51)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.java:108)
...

Estas son mis dependencias de prueba:

testCompile 'junit:junit:4.+',
            'org.powermock:powermock-core:1.5.6',
            'org.powermock:powermock-module-junit4:1.5.6',
            'org.powermock:powermock-api-mockito:1.5.6'

La prueba en sí falla también cuando está completamente vacía (error de inicialización):

@RunWith(PowerMockRunner.class)
public class SomeTest {
    @Test
    public void testSomething() {
    }
}

¿Alguna idea de lo que podría estar mal? Otras pruebas que utilizan PowerMock están funcionando bien (ninguna de usa el PowerMockRunner).

Saludos y gracias por cualquier ayuda! Ben

Author: Stefan Birkner, 2014-10-04

3 answers

Este es un error que se produce cuando se utiliza JUnit 4.12 y PowerMock

testCompile 'junit:junit:4.12',
            'org.powermock:powermock-core:1.6.1',
            'org.powermock:powermock-module-junit4:1.6.1',
            'org.powermock:powermock-api-mockito:1.6.1'

Si no puede actualizar PowerMock, puede usar JUnit 4.11.

testCompile 'junit:junit:4.11',
            'org.powermock:powermock-core:1.5.6',
            'org.powermock:powermock-module-junit4:1.5.6',
            'org.powermock:powermock-api-mockito:1.5.6'

Podría por favor agregar más líneas de stacktrace, que descubran más detalles sobre el problema.

 72
Author: Stefan Birkner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-16 07:15:37

Se ha registrado un error contra PowerMock: https://code.google.com/p/powermock/issues/detail?id=531

Parece que JUnit cambió algunos de sus nombres de campos internos a los que PowerMock estaba accediendo a través de la reflexión, rompiendo así la capacidad de PowerMock para inyectarse correctamente.

 1
Author: Brandon Heck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-12 14:33:54

Comprueba lo que dijo Stefan, y encima de eso también necesitas agregar

@PrepareForTest({<The class/es you are Mocking>, ...})

Sin la preparación para la prueba, PowerMockRunner no sabrá de qué clase se burlan.

 0
Author: SonalKhodiyar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 09:46:43