Mockito et PowerMock : Mocker les méthodes statiques

Mockito est très utile pour pouvoir créer des mocks et ainsi tester des classes qui utilisent des interfaces.

On utilise souvent Mockito pour mocker les objets issus de librairie ou d'API. Le problème c'est que parfois ces API utilisent des méthodes statiques. Ces méthodes statiques ne peuvent pas être mockées.

Pour mocker ces méthodes statiques on peut utiliser PowerMock.

Installation

Pour utiliser PowerMock il faut importer la librairie. Cependant, il faut bien vérifier que la version de PowerMock est compatible avec celle de Mockito.

Vous pouvez consulter le tableau des versions supportées.

Pour Gradle :

testImplementation 'org.mockito:mockito-core:2.24.0'
testImplementation 'org.powermock:powermock-core:2.0.0'
testImplementation 'org.powermock:powermock-module-junit4:2.0.0'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.0'

Pour Maven:

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

Utilisation

Pour utiliser PowerMock vous allez devoir importer plusieurs paquets.

import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.api.mockito.PowerMockito;

Les trois premières importations servent à utiliser les deux annotations suivantes et la classe PowerMockRunner.

@RunWith(PowerMockRunner.class)
@PrepareForTest({MaClasse.class})

Le dernier import sert à utiliser PowerMock. Il s'utilise comme Mockito.

PowerMockito.when(MaClasse.maMethode()).thenReturn("Bonjour");

Conclusion

PowerMock ajoute des fonctionnalités à Mockito et permet de mocker des méthodes statiques.

Cependant, n'oubliez pas que si vous utilisez PowerMock, cela peut signifier que le code testé n'est pas bien conçu. L'utilisation de PowerMock doit se limiter qu'à des cas exceptionnels. Cela vaut aussi pour l'utilisation des mocks.

Commentaires