Ma devise pour Java est "juste parce que Java a blocs statiques, cela ne signifie pas que vous devriez être en utilisant." Blague à part, il y a beaucoup de trucs en Java qui rendent le test d'un cauchemar. Deux des plus je déteste sont Anonymes, des Classes et des Blocs Statiques. Nous avons beaucoup de code legacy qui rendent l'utilisation de Blocs Statiques et elles sont l'un des ennuyeux points dans nos efforts dans l'écriture de tests unitaires. Notre objectif est d'être capable d'écrire des tests unitaires pour les classes qui dépendent de cette initialisation statique avec un minimum de modifications de code.
Jusqu'à présent, ma suggestion à mes collègues, c'est de déplacer le corps de la statique bloc privée d'une méthode statique et de l'appeler en staticInit
. Cette méthode peut alors être appelé à partir de la statique bloc. Pour les tests unitaires d'une autre classe qui dépend de cette classe pourrait facilement se moquer staticInit
avec JMockit de ne rien faire. Nous allons voir cela dans l'exemple.
public class ClassWithStaticInit {
static {
System.out.println("static initializer.");
}
}
Sera changé
public class ClassWithStaticInit {
static {
staticInit();
}
private static void staticInit() {
System.out.println("static initialized.");
}
}
Afin que nous puissions effectuer les opérations suivantes dans un JUnit.
public class DependentClassTest {
public static class MockClassWithStaticInit {
public static void staticInit() {
}
}
@BeforeClass
public static void setUpBeforeClass() {
Mockit.redefineMethods(ClassWithStaticInit.class, MockClassWithStaticInit.class);
}
}
Cependant, cette solution est également livré avec ses propres problèmes. Vous ne pouvez pas exécuter DependentClassTest
et ClassWithStaticInitTest
sur la même JVM puisque vous voulez vraiment la statique bloc à exécuter pour ClassWithStaticInitTest
.
Quel serait votre façon d'accomplir cette tâche? Ou mieux, non JMockit en fonction des solutions que vous pensez de travail plus propre?