Les avis divergent quant à l'utilité des tests des méthodes privées, par exemple, aquí y aquí . Personnellement, je pense que c'est logique, la question est de savoir comment le faire correctement. En C++, vous pouvez utiliser un #define
piratage ou faire de la classe de test friend
en C#, il y a la fonction InternalsVisibleToAttribute mais en Java, nous devons soit utiliser réflexion ou de les rendre "visibles pour les tests" et les annoter comme suit afin de clarifier l'intention. Les inconvénients de l'un et de l'autre devraient être clairs.
Je pense qu'il devrait y avoir quelque chose de mieux. En commençant par
public class Something {
private int internalSecret() {
return 43;
}
}
il serait intéressant de pouvoir appeler des méthodes privées dans le code de test, par exemple
@MakeVisibleForTesting Something something = new Something();
Assert.assertEquals(43, something.internalSecret());
Ici, l'annotation convertirait silencieusement tous les appels aux méthodes privées de something
l'utilisation de la réflexion. Je me demande si Lombok pourrait le faire (et le demandera aux auteurs).
Il est tout à fait possible que faire autant de magie s'avère trop compliqué, et dans tous les cas cela prendra du temps, donc je cherche une alternative. Peut-être en annotant la classe testée avec quelque chose comme @Decapsulate
et en utilisant un processeur d'annotation pour générer une classe Decapsulated_Something
à l'image de
public class Decapsulated_Something {
public Decapsulated_Something(Something delegate) {
this.delegate = delegate
}
public boolean internalSecret() {
// call "delegate.internalSecret()" using reflection
}
...
}
ce qui permettrait d'utiliser
Decapsulated_Something something = new Decapsulated_Something(new Something());
Assert.assertEquals(43, something.internalSecret());
Je n'ai pas beaucoup d'expérience en matière de traitement des annotations, c'est pourquoi je demande d'abord ici :
- Dans quelle mesure la mise en œuvre est-elle compliquée ?
- Qu'ai-je oublié ?
- Qu'en pensez-vous d'une manière générale ?