classe publique A { méthode publique void (booléen b) { si (b == vrai) method1 (); autre method2 (); } private void method1 () {} private void method2 () {} }
public class TestA { @Tester public void testMethod () { A a = simulé (classe A.); a.method (vrai); // comment tester comme verify (a) .method1 (); } }
Comment tester la méthode privée est appelée ou non, et comment tester la méthode privée en utilisant mockito ???
Réponses:
Vous ne pouvez pas faire cela avec Mockito mais vous pouvez utiliser Powermock pour étendre Mockito et simuler des méthodes privées. Powermock soutient Mockito. Voici un exemple.
la source
Pas possible via mockito. De leur wiki
la source
Voici un petit exemple comment le faire avec powermock
Pour tester la méthode 1, utilisez le code:
Pour définir un objet privé obj, utilisez ceci:
la source
Pensez-y en termes de comportement, pas en termes de méthodes existantes. La méthode appelée
method
a un comportement particulier sib
est vrai. Il a un comportement différent s'ilb
est faux. Cela signifie que vous devez écrire deux tests différents pourmethod
; un pour chaque cas. Donc, au lieu d'avoir trois tests orientés méthode (un pourmethod
, un pourmethod1
, un pourmethod2
, vous avez deux tests orientés comportement.Lié à ceci (j'ai suggéré ceci dans un autre fil SO récemment, et j'ai été appelé un mot de quatre lettres en conséquence, alors n'hésitez pas à prendre ceci avec un grain de sel); Je trouve utile de choisir des noms de test qui reflètent le comportement que je teste, plutôt que le nom de la méthode. Donc , ne pas appeler vos tests
testMethod()
,testMethod1()
,testMethod2()
et ainsi de suite. J'aime les noms commecalculatedPriceIsBasePricePlusTax()
outaxIsExcludedWhenExcludeIsTrue()
qui indiquent quel comportement je teste; puis dans chaque méthode d'essai, testez uniquement le comportement indiqué. La plupart de ces comportements impliqueront un seul appel à une méthode publique, mais peuvent impliquer de nombreux appels à des méthodes privées.J'espère que cela t'aides.
la source
Bien que Mockito ne fournisse pas cette fonctionnalité, vous pouvez obtenir le même résultat en utilisant Mockito + la classe JUnit ReflectionUtils ou la classe Spring ReflectionTestUtils . Veuillez voir un exemple ci-dessous tiré d' ici expliquant comment invoquer une méthode privée:
Des exemples complets avec ReflectionTestUtils et Mockito peuvent être trouvés dans le livre Mockito for Spring
la source
Vous n'êtes pas censé tester des méthodes privées. Seules les méthodes non privées doivent être testées car elles doivent de toute façon appeler les méthodes privées. Si vous «souhaitez» tester des méthodes privées, cela peut indiquer que vous devez repenser votre conception:
Est-ce que j'utilise une injection de dépendance appropriée? Dois-je éventuellement déplacer les méthodes privées dans une classe séparée et plutôt tester cela? Ces méthodes doivent-elles être privées? ... ne peuvent-ils pas être par défaut ou protégés plutôt?
Dans l'exemple ci-dessus, les deux méthodes appelées "au hasard" peuvent en fait devoir être placées dans une classe à part, testées puis injectées dans la classe ci-dessus.
la source
J'ai pu tester une méthode privée à l'intérieur en utilisant mockito en utilisant la réflexion. Voici l'exemple, j'ai essayé de le nommer de manière à ce qu'il ait du sens
la source
En utilisant la réflexion, les méthodes privées peuvent être appelées à partir de classes de test. Dans ce cas,
// la méthode de test sera comme ça ...
Si la méthode privée appelle une autre méthode privée, nous devons espionner l'objet et stuber l'autre méthode.La classe de test sera comme ...
// la méthode de test sera comme ça ...
** L'approche consiste à combiner réflexion et espionnage de l'objet. ** method1 et ** method2 sont des méthodes privées et method1 appelle method2.
la source
Je ne comprends pas vraiment votre besoin de tester la méthode privée. Le problème racine est que votre méthode publique a void comme type de retour et que vous ne pouvez donc pas tester votre méthode publique. Par conséquent, vous êtes obligé de tester votre méthode privée. Ma supposition est-elle correcte?
Quelques solutions possibles (AFAIK):
Vous vous moquez de vos méthodes privées, mais vous ne testerez pas "réellement" vos méthodes.
Vérifiez l'état de l'objet utilisé dans la méthode. La plupart des méthodes effectuent un certain traitement des valeurs d'entrée et renvoient une sortie, ou modifient l'état des objets. Le test des objets pour l'état souhaité peut également être utilisé.
Refactorisez un peu votre code (j'espère que ce n'est pas un ancien code). Mon principe d'écriture d'une méthode est que, il faut toujours retourner quelque chose (un int / un booléen). La valeur retournée PEUT ou PEUT NE PAS être utilisée par l'implémentation, mais elle sera VRAIMENT utilisée par le test
code.
la source
Il existe en fait un moyen de tester les méthodes d'un membre privé avec Mockito. Disons que vous avez une classe comme celle-ci:
Si vous voulez tester
a.method
, vous invoquerez une méthode à partir deSomeOtherClass
, vous pouvez écrire quelque chose comme ci-dessous.ReflectionTestUtils.setField();
va stuber le membre privé avec quelque chose que vous pouvez espionner.la source
Mettez votre test dans le même package, mais dans un dossier source différent (src / main / java vs src / test / java) et rendez ces méthodes package-private. La testabilité IMO est plus importante que la confidentialité.
la source
Dans les cas où la méthode privée n'est pas void et que la valeur de retour est utilisée comme paramètre de la méthode d'une dépendance externe, vous pouvez simuler la dépendance et utiliser un
ArgumentCaptor
pour capturer la valeur de retour. Par exemple:la source