java - How do I mock a method using EasyMock -
user getuser(int id) { user user = service.get( id ); if( user != null ) { user.stuff = getuserstuff( id ); homecoming user; } throw new notfoundexception(); } stuff getuserstuff( int id ) { stuffgetter.getstuff( id ); // stuff getter makes rest phone call homecoming stuff; }
using easymock, how test getuser(id)
method. confusing part me getuserstuff(id)
makes external phone call dont want create when testing getuser
.
as mentioned other users in comments, need provide mock instances of objects making calls wish mock out.
so within getuser(id)
can see phone call object called service
should mocked out. utilize mock instance of service class , phone call get(id)
can mocked out.
then within getuserstuff(id)
method, uses stuffgetter
object mocked out again. method beingness called have expectations set it. (an alternative set partial mock , mock getuserstuff(id)
method together, bit beyond you're looking think)
with things in mind, created next class test described utilize case:
public class classtotest { private final service service; private final stuffgetter stuffgetter; public classtotest() { this( new service(), new stuffgetter() ); } public classtotest(final service service, final stuffgetter stuffgetter) { this.service = service; this.stuffgetter = stuffgetter; } public user getuser(final int id) { final user user = this.service.get( id ); if( user != null ) { user.stuff = getuserstuff( id ); homecoming user; } throw new notfoundexception(); } public stuff getuserstuff( final int id ) { homecoming this.stuffgetter.getstuff( id ); } }
having constructors set gives me ability set mock instances of dependencies within tests. follows test getuser(id)
method uses mocks 2 objects. uses basic easymock concepts of expect, replay , verify.
service
, stuffgetter
. write expectations method calls using expect
method. specify returned if method mocking not void method. replay mock objects, in case replay both of them. means can no longer add together expectations because mocks no longer in record mode recording expectations. execute tests. verify expected method calls on mocks executed desired. the tests looks this:
import static org.junit.assert.assertequals; import org.easymock.easymock; import org.junit.test; public class classtotesttest { @test public void thatgetidcallsexpectedmockmethods() { final user user = new user(); final stuff userstuff = new stuff(); final service mockservice = easymock.createmock(service.class); final stuffgetter mockstuffgetter = easymock.createmock(stuffgetter.class); easymock.expect( mockservice.get(15) ).andreturn( user ); easymock.expect( mockstuffgetter.getstuff(15) ).andreturn( userstuff ); easymock.replay( mockservice, mockstuffgetter ); final classtotest classtotest = new classtotest( mockservice, mockstuffgetter ); final user returneduser = classtotest.getuser(15); assertequals(returneduser, user); assertequals(returneduser.stuff, userstuff); easymock.verify( mockservice, mockstuffgetter ); } }
java unit-testing mocking easymock
No comments:
Post a Comment