Méthode statique simulée utilisant JMockit

Méthode statique simulée utilisant JMockit

1. Vue d'ensemble

Certaines bibliothèques de simulation populaires telles queMockito and Easymock génèrent des maquettes en tirant parti du modèle de classe basé sur l'héritage de Java. EasyMock implements an interface at runtime, whereas Mockito inherits from the target class to create a mocking stub.

Aucune approche 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 does provide a static method mocking features.

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

Pour une introduction à JMockit, veuillez consulter nosprevious article.

2. Dépendances 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 surMaven Central.

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

Tout d'abord, considérons un cas où nous avonsa class with a non-static method that internally depends upon static method:

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éthodemanagerResponse(). Puisque sa valeur de retour dépend d'une autre méthode, nous devons nous moquer de la méthodeisResponsePositive().

Nous pouvons nous moquer de cette méthode statique en utilisantJMockit’s classe anonymemockit.MockUp.MockUp<T> (where T will be the class name) et@Mock annotation:

@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 desisResponsePositive() 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'utilitaireAssertions 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,we’d need to mock private static method. Nous pouvons utiliser la méthode de sutilitéDeencapsulation.invoke() fournie parJMockit:

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

Comme son nom l’indique, son objectif est dede-encapsulate l’état d’un objet. JMockit simplifie ainsi 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 en utilisantJMockit. Pour un aperçu plus détaillé de certaines des fonctionnalités avancées de JMockit, jetez un œil à nosarticle d'utilisation avancée de JMockit.

Comme d'habitude, le code source complet de ce didacticiel est disponibleover on GitHub.