Se moquer des méthodes privées à l'aide de PowerMock

1. Vue d'ensemble

L'un des défis des tests unitaires est de se moquer des méthodes privées.

Dans ce didacticiel, nous allons apprendre comment nous pouvons y parvenir en utilisant la bibliothèque PowerMock - qui est prise en charge par JUnit et TestNG.

PowerMock s'intègre à des frameworks moqueurs tels que EasyMock et Mockito et est destiné à ajouter des fonctionnalités supplémentaires à ceux-ci - telles que la simulation de méthodes privées, de classes finales et de méthodes finales, etc.

Il fait cela en s'appuyant sur la manipulation de bytecode et un chargeur de classe entièrement séparé.

2. Dépendances de Maven

Tout d'abord, ajoutons les dépendances requises pour utiliser PowerMock avec Mockito et JUnit dans notre pom.xml :

 org.powermock powermock-module-junit4 1.7.3 test   org.powermock powermock-api-mockito2 1.7.3 test 

Les dernières versions peuvent être consultées ici et ici.

3. Exemple

Commençons par un exemple de LuckyNumberGenerator. Cette classe a une seule méthode publique pour générer un nombre chanceux:

public int getLuckyNumber(String name) { saveIntoDatabase(name); if (name == null) { return getDefaultLuckyNumber(); } return getComputedLuckyNumber(name.length()); }

4. Variations dans la moquerie des méthodes privées

Pour des tests unitaires exhaustifs de la méthode, nous aurions besoin de nous moquer des méthodes privées.

4.1. Méthode sans argument mais avec valeur de retour

À titre d'exemple simple, simulons le comportement d'une méthode privée sans arguments et forçons-la à renvoyer la valeur souhaitée:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); when(mock, "getDefaultLuckyNumber").thenReturn(300); 

Dans ce cas, nous nous moquons de la méthode privée getDefaultLuckyNumber et lui faisons renvoyer une valeur de 300.

4.2. Méthode avec argument et valeur de retour

Ensuite, simulons le comportement d'une méthode privée avec un argument et forçons-la à renvoyer la valeur souhaitée:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); doReturn(1).when(mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt()); 

Dans ce cas, nous nous moquons de la méthode privée et lui faisons renvoyer 1.

Notez que nous ne nous soucions pas de l'argument d'entrée et utilisons ArgumentMatchers.anyInt () comme caractère générique.

4.3. Vérification de l'invocation d'une méthode

Notre stratégie finale consiste à utiliser PowerMock pour vérifier l'invocation d'une méthode privée:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); int result = mock.getLuckyNumber("Tyranosorous"); verifyPrivate(mock).invoke("saveIntoDatabase", ArgumentMatchers.anyString()); 

5. Un mot d'avertissement

Enfin, bien que les méthodes privées puissent être testées à l'aide de PowerMock, nous devons être extrêmement prudents lors de l'utilisation de cette technique.

Étant donné que le but de nos tests est de valider le comportement d'une classe, nous devons nous abstenir de modifier le comportement interne de la classe pendant les tests unitaires.

Les techniques de moquerie doivent être appliquées aux dépendances externes de la classe et non à la classe elle-même.

Si la moquerie des méthodes privées est essentielle pour tester nos classes, cela indique généralement une mauvaise conception.

6. Conclusion

Dans cet article rapide, nous avons montré comment PowerMock pouvait être utilisé pour étendre la capacité de Mockito à se moquer et à vérifier les méthodes privées dans la classe testée.

Le code source de ce tutoriel se trouve à l'adresse over sur GitHub.