EasyMock void method

FireEnigmaX picture FireEnigmaX · Apr 3, 2014 · Viewed 64.6k times · Source

I'm trying to use EasyMock to mock out some database interface so I can test the business logic off a wrapping method. I've been going ok with methods that return by using the following in my setup of my test.

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

then within my actual test I run

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

This service then connects to the dbmapper and returns the object (the mapper is injected using setter methods)

These type of mocks seem to work fine. However when I try to run a test for

userService.addUser(newUser1);

This method calls a void method.

dbmapper.createUser(newUser);

It's this method that I'm having problems mocking out. I've tried the following

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

as some other posts/questions etc seem to suggest I get an IlligalStateException: no last call on a mock available

Can anyone point me in the right direction please?

Many Thanks in advance

Answer

Dan Temple picture Dan Temple · Apr 3, 2014

You're close.

You just need to call the method on your mock before calling expectLastCall()

So you expectation would look like this:

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

This works because the mock object is in Record mode before the call to replay(), so any calls to it will perform default behaviour (return null/do nothing) and will be eligible for replaying when the replay() method is called.

What I like to do to make sure that it is obvious the method call is for an expectation is to put a small comment in front of it like this:

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