web-dev-qa-db-fra.com

Méthode void EasyMock

J'essaie d'utiliser EasyMock pour simuler une interface de base de données afin de pouvoir tester la logique métier à partir d'une méthode d'encapsulation. Je suis allé bien avec les méthodes qui retournent en utilisant ce qui suit dans ma configuration de mon test.

DBMapper dbmapper = EasyMock.createMock(DBMapper.class);
userService.setDBMapper(dbmapper);        

puis dans mon test réel, je cours

EasyMock.expect(dbmapper.getUser(userId1)).andReturn(mockUser1);
EasyMock.replay(dbmapper);
userService.getUser(userId1);

Ce service se connecte ensuite au dbmapper et renvoie l'objet (le mappeur est injecté à l'aide de méthodes de définition)

Ces types de simulacres semblent bien fonctionner. Cependant, lorsque j'essaie d'exécuter un test pour

userService.addUser(newUser1);

Cette méthode appelle une méthode void.

dbmapper.createUser(newUser);

C'est cette méthode que j'ai du mal à simuler. J'ai essayé ce qui suit

EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

comme certains autres messages/questions, etc. semblent suggérer que je reçois un IlligalStateException: no last call on a mock available

Quelqu'un peut-il m'orienter dans la bonne direction, s'il vous plaît?

Merci d'avance

29
FireEnigmaX

Tu es proche.

Vous avez juste besoin d'appeler la méthode sur votre maquette avant d'appeler expectLastCall()

Donc, votre attente ressemblerait à ceci:

userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

Cela fonctionne car l'objet simulé est en mode d'enregistrement avant l'appel à replay(), donc tous les appels à celui-ci exécuteront un comportement par défaut (retourneront null/ne feront rien) et pourront être rejoués lorsque la fonction replay() la méthode est appelée.

Ce que j'aime faire pour m'assurer qu'il est évident que l'appel de méthode est pour une attente, c'est de mettre un petit commentaire devant comme ceci:

/* expect */ userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
34
Dan Temple

Ce problème ne se produit pas si vous utilisez l'API 'Nice':

DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);

Il existe deux types de simulacres: strict et agréable. La maquette stricte renvoie une erreur d'assertion au cas où une méthode inattendue serait appelée. La maquette Nice permet des appels de méthode inattendus sur la maquette.

Pour plus de détails, reportez-vous au document officiel - http://easymock.org/user-guide.html#mocking-strict

13
RakeshK