Méthode statique simulée utilisant JMockit

1. Vue d'ensemble

Certaines bibliothèques de simulation populaires telles que Mockito et Easymock génèrent des maquettes en tirant parti du modèle de classe basé sur l'héritage de Java. EasyMock implémente une interface au moment de l'exécution, tandis que Mockito hérite de la classe cible pour créer un stub moqueur.

Aucune des deux approches ne fonctionne bien pour les méthodes statiques, car les méthodes statiques sont associées à une classe et ne peuvent pas être remplacées. Cependant, JMockit fournit des fonctionnalités de simulation de méthode statique.

Dans ce didacticiel, nous explorerons certaines de ces fonctionnalités.

Pour une introduction à JMockit, veuillez consulter notre article précédent.

2. Dépendances de Maven

Commençons par les dépendances Maven:

 org.jmockit jmockit 1.24 test 

Vous pouvez trouver les dernières versions de ces bibliothèques sur Maven Central.

3. Méthode statique appelée à partir d'une méthode non statique

Tout d'abord, considérons un cas où nous avons une classe avec une méthode non statique qui dépend en interne de la méthode statique :

public class AppManager { public boolean managerResponse(String question) { return AppManager.isResponsePositive(question); } public static boolean isResponsePositive(String value) { if (value == null) { return false; } int length = value.length(); int randomNumber = randomNumber(); return length == randomNumber ? true : false; } private static int randomNumber() { return new Random().nextInt(7); } }

Maintenant, nous voulons tester la méthode managerResponse (). Comme sa valeur de retour dépend d'une autre méthode, nous devons nous moquer de la méthode isResponsePositive () .

Nous pouvons nous moquer de cette méthode statique en utilisant la classe anonyme de JMockit mockit.MockUp.MockUp ( où T sera le nom de la classe ) et l' annotation @Mock :

@Test public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() { new MockUp() { @Mock public boolean isResponsePositive(String value) { return false; } }; assertFalse(appManager.managerResponse("Some string...")); }

Ici, nous nous moquons de isResponsePositive () avec une valeur de retour que nous aimerions utiliser pour le test. Par conséquent, vérifier le résultat attendu à l'aide de l' utilitaire Assertions disponible dans Junit-5.

4. Test de la méthode statique privée

Dans quelques cas, d'autres méthodes utilisent des méthodes statiques privées de la classe:

private static Integer stringToInteger(String num) { return Integer.parseInt(num); }

Pour tester une telle méthode, nous aurions besoin de simuler une méthode statique privée . Nous pouvons utiliser la méthode utilitaire Deencapsulation.invoke () fournie par JMockit :

@Test public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() { int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110"); assertEquals(110, response); }

Comme son nom l'indique, son but est de désencapsuler l'état d'un objet. De cette façon, JMockit simplifie les méthodes de test qui ne pourraient pas être testées autrement.

5. Conclusion

Dans cet article, nous avons vu comment les méthodes statiques peuvent être simulées à l' aide de JMockit . Pour un aperçu plus détaillé de certaines des fonctionnalités avancées de JMockit, consultez notre article Utilisation avancée de JMockit.

Comme d'habitude, le code source complet de ce didacticiel est disponible à l'adresse over sur GitHub.