2017-09-13 6 views
1

J'écris des tests unitaires pour une application et comme bonne pratique j'essaie de rendre toutes les méthodes dans mes cours aussi privées que possible, donc je peux finir avec des cours avec la plupart privée méthodes, peu publiques et parfois des appels à des méthodes statiques (soit de mes autres classes ou à certains TextUtils, etc)Unité de test des méthodes privées et statiques dans java

Je voudrais savoir comment tester toutes mes classes en essayant de ne compter que sur Mockito et JUnit puisque Robolectric et Powermockito semblent étendre les limites de ce qui devrait être fait dans les tests unitaires. Dois-je ignorer toutes les méthodes privées et statiques ainsi que les méthodes publiques qui, par hasard, appellent des méthodes statiques ou privées? ou comment?

+2

Voici deux questions très distinctes. Généralement, les membres privés doivent être testés indirectement, via l'interface publique, et les méthodes statiques sont généralement testables autonomes. – chrylis

+0

merci @chrylis – kioli

Répondre

2

Toutes les méthodes privées de la classe que vous testez doivent être appelées par une méthode publique/protected/package private; sinon ils sont du code inutilisé. Donc, concentrez-vous sur le test de cette API publique visible par le "code client" de votre application. Les internes (méthodes privées) seront testés/couverts comme effet secondaire car ils implémentent réellement le contrat public spécifié par l'API.

Tester directement les détails d'implémentation (méthodes privées) rendrait les tests plus difficiles à maintenir et le code sous test plus difficile à refactoriser.

+0

merci pour la réponse. Je pensais vraiment à ça, mais ça avait l'air un peu mal dans ma tête puisque si j'ai une méthode publique qui appelle aussi une méthode privée et que je teste la première pour les attraper tous les deux, je ne teste plus une "unité" ensemble " – kioli

+1

L '" unité "dans les tests unitaires n'est pas toujours si simple à définir. Mais en général, je pense que cela rend les choses plus faciles à long terme si vous vous concentrez sur le test de l'interface publique de votre classe et que vous gardez les détails de l'implémentation bien encapsulés. Si vous pensez que les méthodes privées font des choses que vous souhaitez tester spécifiquement, cela implique peut-être que cette logique devrait être modélisée dans sa propre classe qui pourrait ensuite être testée séparément (publiquement). –

+0

@kioli * "on sent que je ne suis plus en train de tester une" unité "mais un" ensemble "" * ** - ** La question ici est * qu'est-ce qu'une ** unité **?* J'aime la définition de Roy Osherove: * Une unité est un tas de code qui a la même raison de changer *. Cela signifie qu'une unité peut être une méthode unique ou deux classes. –

2

Remarque: il s'agit uniquement d'informations générales, car votre question ne fournit pas de code à commenter. Puisque les méthodes privées ne sont généralement pas accessibles en dehors de la classe (la réflexion est complètement différente) et sont généralement là pour fournir des fonctionnalités à vos méthodes publiques et protégées, votre test unitaire doit juste tester vos méthodes publiques et protégées. Si vous choisissez soigneusement vos données de test, vous devriez être en mesure d'exercer la majeure partie/la totalité du code.

Vous pouvez utiliser Mockito pour simuler les dépendances requises par la classe testée. Vous utilisez les attentes (Mockito.when(...).thenReturn(...) ou Mockito.verify(mockedClass).method(...)) pour simuler une fonctionnalité externe ou vérifier que la classe testée effectue les appels sortants comme prévu.

Vous pouvez utiliser des assertions pour vérifier que les méthodes testées renvoient des valeurs appropriées. Gardez à l'esprit cependant, un test unitaire détaillé avec une couverture de code élevée a une grande chance de casser la première fois que vous essayez de modifier l'implémentation interne de la classe testée. C'est un acte d'équilibrage, et vous devez trouver le bon niveau de couverture, tout en minimisant la fragilité du test.

+0

je vous remercie pour la réponse, j'ai commenté la réponse ci-dessus pourquoi je pensais qu'il peut avoir eu tort de passer le test direct de la méthode privée – kioli