109 votes

junit & java : le test de non-public des méthodes de

Je suis nouveau à la réalisation des tests unitaires ainsi que junit.

JUnit ne tester ces méthodes de ma classe qui sont du domaine public. Comment dois-je faire junit test sur ceux qui ne le sont pas (c'est à dire, private, protected)?

Je peux les tester en n'utilisant junit, mais je me demandais ce que junit méthode standard a été.

94voto

MattK Points 7319

Une école de pensée sur les tests unitaires dit que vous ne devriez être en mesure de tester les méthodes publiques, parce que vous ne doit être l'unité de test de votre API publique, et que, ce faisant, vous devriez être en couvrant le code dans votre non-méthodes publiques. Votre kilométrage peut varier, je trouve que c'est parfois le cas, et parfois pas.

Cela étant dit, il ya un couple de façons de tester la non-public des méthodes:

  • Vous pouvez tester protégées et l'emballage-champ d'application des méthodes en mettant vos tests unitaires dans le même package que les classes, ils ont testé. C'est une pratique assez courante.
  • Vous pouvez tester protégé méthodes de tests unitaires dans un autre package, par la création d'une sous-classe de la classe sous test qui remplace les méthodes que vous souhaitez tester en tant que public, et ceux-ci ayant remplacé les méthodes d'appeler les méthodes originales avec le mot-clé super. En général, ce "test de la sous-classe" serait un intérieur de classe dans le cas de test JUnit cours de l'essai. C'est un peu plus hacky, à mon avis, mais je l'ai fait.

Espérons que cette aide.

40voto

Kent Beck Points 4208

Comme avec bon nombre de problèmes de tests, les tests méthodes privées est en fait un problème de conception dans le déguisement. Plutôt que d'essayer de faire quelque chose de difficile à tester des méthodes privées, quand je me retrouve souhaitant écrire des tests pour les méthodes privées, je prends une minute pour me demander, "Comment aurais-je besoin pour concevoir ce afin que je puisse le tester à fond à travers les méthodes publiques?"

Si cela ne fonctionne pas, JUnitX permet de tester des méthodes privées, bien que je crois qu'il n'est disponible que pour JUnit 3.8.

26voto

duffymo Points 188155

Lorsque vous écrivez un test JUnit, vous avez à faire à un subtil changement de mentalité: "je suis un client de ma propre classe maintenant." Cela signifie que privé est privé, et vous seulement de tester le comportement que le client voit.

Si la méthode doit être vraiment privé, j'avais considère que c'est un défaut de conception pour le rendre visible juste pour le plaisir de tester. Vous avez obtenu d'être en mesure d'en déduire son bon fonctionnement basé sur ce que le client voit.

Dans les trois années qui ont passé depuis l'origine, j'avais écrit ceci, j'ai commencé à approcher le problème un peu différemment, à l'aide de Java réflexion.

Le sale petit secret, c'est que vous pouvez tester des méthodes privées de JUnit, comme vous le feriez dans le réseau public, à l'aide de la réflexion. Vous pouvez tester le contenu de votre coeur et de ne pas les exposer comme publics pour les clients.

9voto

marcumka Points 951

Si vous avez une quantité importante de la logique enterré sous relativement peu de "Public" points d'entrée, vous êtes probablement à violer le Principe de Responsabilité Unique. Si possible, vous aurez envie de refactoriser le code en plusieurs classes, ce qui mène à de plus "Public", les méthodes de mise à l'essai.

9voto

starblue Points 29696

La solution la plus simple est de mettre les tests JUnit dans le même paquet (mais autre répertoire) et utiliser la valeur par défaut (c'est à dire colis-privé) de la visibilité pour les méthodes.

Un autre plus compliqué approche consiste à utiliser la réflexion pour accéder à des méthodes privées.

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