web-dev-qa-db-fra.com

Modifier le paramètre d'entrée d'une fonction void et le lire ensuite

J'ai une fonction Java Java assez complexe que je veux tester avec jUnit et j'utilise Mockito à cet effet. Cette fonction ressemble à ceci:

public void myFunction (Object parameter){
   ...
   doStuff();
   ...
   convert(input,output);
   ...
   parameter.setInformationFrom(output);
}

La fonction convert définit les attributs de sortie en fonction de l'entrée et c'est une fonction de type void, bien que le paramètre "output" soit ce qui est utilisé comme s'il était retourné par la fonction. Cette fonction de conversion est ce que je veux modéliser car je n'ai pas besoin de dépendre de l'entrée pour le test, mais je ne sais pas comment faire, car je ne suis pas très familier avec Mockito.

J'ai vu des cas de base comme when(something).thenReturn(somethingElse) ou la méthode doAnswer qui, je crois, est similaire à la précédente mais plus de logique peut y être ajoutée, mais je ne pense pas que ces cas soient appropriés pour mon cas, car ma fonction n'a pas de déclaration de retour.

34
Juan

Si vous voulez que la méthode simulée appelle une méthode sur (ou modifie d'une autre manière) un paramètre, vous devrez écrire une réponse comme dans cette question ( "Comment simuler une méthode de retour vide affectant un objet" =).

De Kevin Welker 's réponse là:

doAnswer(new Answer() {
    Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        ((MyClass)args[0]).myClassSetMyField(NEW_VALUE);
        return null; // void method, so return null
    }
}).when(mock).someMethod();

Notez que les meilleures pratiques plus récentes auraient un paramètre de type pour Answer, comme dans Answer<Void>, et que Java 8 peuvent compresser davantage la syntaxe. Par exemple:

doAnswer(invocation -> {
  Object[] args = invocation.getArguments();
  ((MyClass)args[0]).myClassSetMyField(NEW_VALUE);
  return null; // void method in a block-style lambda, so return null
}).when(mock).someMethod();
62
Jeff Bowman