120 votes

pour rendre une méthode privée publique uniquement pour les classes de test

Qui a une solution pour ce besoin commun.

J'ai une classe dans mon application.

certaines méthodes sont publiques, car elles font partie de l'interface utilisateur, et d'autres sont privées, car elles servent à rendre le flux interne plus lisible.

Maintenant, disons que je veux écrire un test unitaire, ou plutôt un test d'intégration, qui sera situé dans un paquet différent, qui sera autorisé à appeler cette méthode, MAIS, je veux que l'appel normal à cette méthode ne soit pas autorisé si vous essayez de l'appeler à partir des classes de l'application elle-même.

Je pensais donc à quelque chose comme ça

public class MyClass {

   public void somePublicMethod() {
    ....
   }

   @PublicForTests
   private void somePrivateMethod() {
    ....
   }
}

L'annotation ci-dessus marquera la méthode privée comme "publique pour les tests" ce qui signifie que la compilation et l'exécution seront autorisées pour toute classe faisant partie du package test..., tandis que la compilation et l'exécution seront autorisées pour toute classe faisant partie du package test... \or échouera pour toute classe qui ne fait pas partie du paquetage de test.

Des idées ? Existe-t-il une annotation de ce type ? Existe-t-il une meilleure façon de procéder ?

il semble que plus on écrit de tests unitaires, plus on est obligé de casser l'encapsulation...

3voto

Stas Kurilin Points 5955

Ou vous pouvez extraire cette méthode vers un stratégie objet. Dans ce cas, vous pouvez facilement tester la classe extraite et ne pas rendre la méthode publique ou faire de la magie avec la réflexion/bytecode.

2voto

Facu Farias Points 44

D'accord, nous avons ici deux choses qui sont mélangées. La première chose, c'est lorsque vous avez besoin de marquer quelque chose à utiliser uniquement en test, ce qui, je suis d'accord avec @JB Nizet, serait une bonne chose d'utiliser l'annotation guava.

Une autre solution consiste à tester les méthodes privées. Pourquoi tester les méthodes privées de l'extérieur ? Je veux dire Vous devriez être en mesure de tester l'objet par ses méthodes publiques, et à la fin que son comportement. C'est du moins ce que nous faisons et essayons d'enseigner aux développeurs juniors, qui essaient toujours de tester les méthodes privées (en tant que bonne pratique).

1voto

Woot4Moo Points 14245

Je n'ai pas connaissance d'une telle annotation, mais ce qui suit peut être utile : tests unitaires des méthodes privées
ou ce qui suit : JMockit

1voto

Joeri Hendrickx Points 6957

Vous ne pouvez pas faire cela, car alors comment pourriez-vous compiler vos tests ? Le compilateur ne tiendra pas compte de l'annotation.

Il existe deux approches générales

La première consiste à utiliser la réflexion pour accéder aux méthodes de toute façon

La seconde consiste à utiliser package-private au lieu de private, puis à placer vos tests dans le même package (mais dans un module différent). Ils seront essentiellement privés aux autres codes, mais vos tests pourront toujours y accéder.

Bien entendu, si vous effectuez des tests en boîte noire, vous ne devriez de toute façon pas accéder aux membres privés.

1voto

Snicolas Points 19644

Nous avons récemment publié une bibliothèque qui permet d'accéder aux champs privés, aux méthodes et aux classes internes par le biais de la réflexion : BoundBox

Pour une classe comme

public class Outer {
    private static class Inner {
        private int foo() {return 2;}
    }
}

Il fournit une syntaxe comme :

Outer outer = new Outer();
Object inner = BoundBoxOfOuter.boundBox_new_Inner();
new BoundBoxOfOuter.BoundBoxOfInner(inner).foo();

La seule chose à faire pour créer la classe BoundBox est d'écrire @BoundBox(boundClass=Outer.class) et le BoundBoxOfOuter sera instantanément générée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X