web-dev-qa-db-fra.com

Utilisation de doThrow () doAnswer () doNothing () et doReturn () dans mockito

J'apprenais mockito et j'ai compris les utilisations de base des fonctions mentionnées ci-dessus à partir du link .

Mais j'aimerais savoir s'il peut être utilisé dans d'autres cas?

38
User666

doThrow : essentiellement utilisé lorsque vous voulez lever une exception lorsqu'une méthode est appelée dans un objet fictif.

public void validateEntity(final Object object){}
Mockito.doThrow(IllegalArgumentException.class)
.when(validationService).validateEntity(Matchers.any(AnyObjectClass.class));

doReturn : Utilisé lorsque vous souhaitez renvoyer une valeur de retour lorsqu'une méthode est exécutée.

public Socket getCosmosSocket() throws IOException {}
Mockito.doReturn(cosmosSocket).when(cosmosServiceImpl).getCosmosSocket();

doAnswer : Parfois, vous devez effectuer certaines actions avec les arguments passés à la méthode, par exemple ajouter des valeurs, effectuer des calculs ou même les modifier. doAnswer vous donne l'interface de réponse en cours d'exécution au moment où Lorsque la méthode est appelée, cette interface vous permet d’interagir avec les paramètres via l’argument InvocationOnMock. En outre, la valeur renvoyée par la méthode answer sera la valeur renvoyée par la méthode simulée.

public ReturnValueObject quickChange(Object1 object);
Mockito.doAnswer(new Answer<ReturnValueObject>() {

        @Override
        public ReturnValueObject answer(final InvocationOnMock invocation) throws Throwable {

            final Object1 originalArgument = (invocation.getArguments())[0];
            final ReturnValueObject returnedValue = new ReturnValueObject();
            returnedValue.setCost(new Cost());

            return returnedValue ;
        }
}).when(priceChangeRequestService).quickCharge(Matchers.any(Object1.class));

doNothing : Est le plus simple de la liste. En gros, il dit à Mockito de ne rien faire lorsqu'une méthode dans un objet fictif est appelée. Parfois utilisé dans les méthodes de retour nul ou sans effet secondaire, ou sans lien avec les tests unitaires que vous effectuez.

public void updateRequestActionAndApproval(final List<Object1> cmItems);

Mockito.doNothing().when(pagLogService).updateRequestActionAndApproval(
                Matchers.any(Object1.class));
82
Koitoer

Cela dépend du type de double test avec lequel vous souhaitez interagir:

  • Si vous n'utilisez pas doNothing et vous mock un objet, la méthode réelle n'est pas appelée
  • Si vous n'utilisez pas doNothing et que vous espionnez un objet, la vraie méthode s'appelle

En d'autres termes, vous ne vous moquez que des interactions utiles avec un collaborateur. Par défaut, les fonctions renvoient null, les méthodes void ne font rien.

2
David Obber

Si vous testez une classe logique et qu'elle appelle des méthodes vides internes, doNothing est parfait. 

0
Rodrigo Asensio

Un exemple très simple est que si vous avez une UserService qui a @Autowired jpa resposiroty UserRepository 

...
class UserService{

  @Autowired
  UserRepository userRepository;
...
}

puis dans la classe de test pour UserService vous ferez 

...
class TestUserService{
  @Mock 
  UserRepository userRepository;

  @InjectMocks
  UserService userService;

...
}

@InjectMocks indique au framework qui prend le @Mock UserRepository userRespository; et l'injecte dans userService afin que, plutôt que de connecter automatiquement une instance réelle de UserRepository, une maquette de UserRepository sera injectée dans userService.

0
Toseef Zafar