Question

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

Was it helpful?

Solution

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);

OTHER TIPS

This problem does not happens if you use the 'nice' API:

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

There are two kinds of mock - strict and nice. The strict mock throws Assertion Error in case an unexpected method is called. The nice mock allows unexpected method calls on the mock.

For further details, refer to the official doc - http://easymock.org/user-guide.html#mocking-strict

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top