web-dev-qa-db-fra.com

Comment simuler un appel de méthode et renvoyer une valeur sans exécuter la méthode?

Considérez la méthode suivante:

public boolean isACertainValue() {
        if(context.getValueA() != null && context.getValueA().toBoolean() == true) {
        if(context.getType() != null && context.getType() == ContextType.certainType) {
            return true;
        }
    }
    return false;
}

Je n'ai pas écrit ce code, il est vraiment moche, il est totalement compliqué, mais je dois travailler avec.

Maintenant, je veux tester une méthode qui repose sur un appel à cette méthode.

Je pensais pouvoir gérer cela en:

Mockito.when(spy.isACertainValue()).thenReturn(true); parce que c'est le cas que je veux tester.

Mais cela ne fonctionne pas car il appelle toujours le corps de la méthode: /

Je reçois nullpointers ou plutôt je reçois quelque chose le long des lignes de 

abuser.WrongTypeOfReturnValue; Les valeurs booléennes ne peuvent pas être retournées par getValueA () . getValueA () devrait renvoyer ValueA

J'ai donc essayé (comme solution de contournement) de faire:

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA()); And Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

mais alors je reçois un nullpointer que je n'arrive pas à pouvoir déboguer.

Alors, comment fait-on bien dans ce cas?

14
Sorona

Quand vous invoquez

Mockito.when(spy.isCertainValue()).thenReturn(true);

la méthode isCertainValue() est appelée ici. Voici comment fonctionne Java: pour évaluer l’argument de Mockito.when, le résultat de spy.isCertainValue() doit être évalué, ainsi la méthode doit être appelée.

Si vous ne voulez pas que cela se produise, vous pouvez utiliser la construction suivante :

Mockito.doReturn(true).when(spy).isCertainValue();

Cela aura le même effet moqueur, mais la méthode ne sera pas appelée avec cela.

19
Tunaki

Ce code est correct:

Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

Mais vous obtenez NullPointerException parce que vous n'avez pas défini la valeur Mocking qui devrait être définie, eh bien, j'utilise Spring, dans mon fichier de contexte lorsque je définis un bean @Autowired, je le définit comme suit:

<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.example.myspringproject.bean.ContextMock" />
</bean>
0
Chris Sim