Mockito: quand la méthode Aa est appelée, exécutez Bb

J’utilise Mockito pour les tests JUnit. Donc, il y a une classe donnée A qui est utilisée à partir du code que je veux tester:

class A{ public A(){} public final Ssortingng a(Ssortingng x){ return "Aa: " + x; } } 

et je veux remplacer l’appel de méthode Aa par un autre appel de méthode avec les mêmes arguments et le même type de valeur de retour. Comme vous pouvez le constater, il n’est pas possible de remplacer la méthode a en étendant la classe telle qu’elle est finale. Donc, ce que j’ai maintenant est une autre classe B avec la méthode Bb:

 class B{ public B(){} public Ssortingng b(Ssortingng x){ return "Bb: " + x; } } 

Maintenant, je veux m’assurer que chaque fois que Aa est appelé à partir du code, la valeur de retour de Bb est utilisée à la place. Existe-t-il une possibilité de réaliser cela avec Mockito (quelque chose comme Mockito.when(Aa(x)).thenReturn(Bb(x)); ) mais avec le même paramètre x, sans connaître la valeur de x?

Toute aide serait appréciée, merci d’avance!

Il n’est pas possible de remplacer les méthodes finales pour les simulations générées par Mockito, en fonction des limites de Mockito . Mais vous pouvez utiliser Powermock pour pirater du code au moment de l’exécution afin que Mockito puisse faire son travail.

Eh bien, mockito se moque de l’extension de la classe et de la méthode, ce qui dans votre cas n’est pas possible avec Aa(Ssortingng) . Si vous voulez que cela se produise, vous devez supprimer le dernier modificateur.

Supposons maintenant que Aa(Ssortingng) n’est pas définitif, ce que vous demandez est tout à fait réalisable avec mockito:

 given(mockA.a(anySsortingng()).willAnswer(returnOfB(bInstance)); Answer returnOfB(final B bInstance) { return new Answer() { public Ssortingng answer(Invocation invocation) { Ssortingng arg = (Ssortingng) invocation.getActualArguments()[0]; return bInstance.b(arg); } }; } 

Veuillez noter que cette réponse a été écrite sur un téléphone et peut avoir une faute de frappe ou un nom incorrect, bien que vous devriez avoir une idée de ce qui devrait être fait pour obtenir ce que vous voulez.

À votre santé

En gros, j’ai pris votre configuration et écrit un test unitaire avec celle-ci. Ce qui est apparu en premier était un message d’erreur qui indiquait explicitement ceci:

org.mockito.exceptions.misusing.MissingMethodInvocationException: when () requirejs un argument qui doit être ‘un appel de méthode sur un mock’.

Et plus loin dans la trace, il est indiqué que “vous remplacez l’une des méthodes suivantes: final / private / equals () / hashCode (). Ces méthodes ne peuvent pas être stubées / vérifiées”.

Donc, selon Mockito, vous ne pouvez pas arrêter les méthodes finales, et c’est tout.

Edit: Vous devez donc supprimer le dernier modificateur ou, si vous êtes bloqué dans cette classe, trouvez un autre moyen de la contourner.