web-dev-qa-db-fra.com

Impossible d'exécuter le test JUnit avec PowerMockRunner

J'ai un projet basé sur Gradle Java projet où je veux maintenant me moquer d'une méthode privée à l'aide de PowerMock. Le problème est que je ne peux pas utiliser PowerMockRunner car je reçois toujours l'exception suivante lorsque j'ajoute l'annotation @RunWith(org.powermock.modules.junit4.PowerMockRunner.class).

Erreur:

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

Ce sont mes dépendances de test:

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'

Le test lui-même échoue également lorsqu'il est complètement vide (erreur d'initialisation):

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

Des idées ce qui pourrait être faux? D'autres tests utilisant PowerMock fonctionnent correctement (aucun d'entre eux n'utilise le PowerMockRunner).

Salutations et merci pour toute aide! Ben

53
Ben

Il s'agit d'un bogue qui survient lorsque vous utilisez JUnit 4.12 et PowerMock <1.6.1. Le problème est résolu dans PowerMock 1.6.1. Veuillez mettre à jour vos dépendances en conséquence

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 vous ne pouvez pas mettre à niveau PowerMock, vous pouvez utiliser 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'

Pourriez-vous s'il vous plaît ajouter d'autres lignes du stacktrace, qui fournissent plus de détails sur le problème.

75
Stefan Birkner

Un bogue a été enregistré contre PowerMock: https://code.google.com/p/powermock/issues/detail?id=531

Il semble que JUnit ait modifié certains des noms de champs internes auxquels PowerMock avait accès via la réflexion, empêchant ainsi PowerMock de s’injecter correctement.

1
Brandon Heck

Vérifiez ce que Stefan a dit, et surtout vous devez également ajouter

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

sans préparation au test, PowerMockRunner ne saura pas quelle classe est moquée.

0
SonalKhodiyar