Wednesday 15 April 2015

java - How to mock a class using singleton instance -



java - How to mock a class using singleton instance -

i using dao class singleton.i using dao class instance in service class.i want unit test service class.so have mock dao class. tried easymock.

@runwith(powermockrunner.class)

@preparefortest(musicplayerdaoimpl.class) public class musicplayerservicetest {

private musicplayerdaoimpl dao; private musicplayerserviceimpl service; @before public void setup() throws sqlexception{ this.service = musicplayerserviceimpl.getinstance(); suppressconstructor(musicplayerdaoimpl.class); mockstatic(musicplayerdaoimpl.class); this.dao = createmock(musicplayerdaoimpl.class); this.service.setinstance(this.dao); song song = new song(); album album = new album(); genre genre = new genre(); album.setalbumname("some album); genre.setgenrename("some genre); song.settitle("title"); song.setrating(4); song.setalbum(album); song.setgenre(genre); easymock.expect(this.dao.getsong("bahara")).andreturn(song); easymock.replay(this.dao); } @test public void getsongtest() throws sqlexception, illegalstateexception, securityexception, systemexception { string title = "title"; song returnsong = this.service.getsong(title); asserttrue(returnsong.gettitle() == title); }

}

i getting error "java.lang.assertionerror: unexpected method call"

java.lang.assertionerror: unexpected method phone call musicplayerdaoimpl.getsong("title"): musicplayerdaoimpl.getsong("title"): expected: 1, actual: 2 @ org.easymock.internal.mockinvocationhandler.invoke(mockinvocationhandler.java:44) @ org.easymock.internal.objectmethodsfilter.invoke(objectmethodsfilter.java:94) @ org.easymock.internal.classproxyfactory$mockmethodinterceptor.intercept(classproxyfactory.java:97) @ service.musicplayerdaoimpl$$enhancerbycglib$$e2ddeccf.getsong(<generated>) @ service.musicplayerserviceimpl.getsong(musicplayerserviceimpl.java:99) @ musicplayerservicetest.getsongtest(musicplayerservicetest.java:64) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:606) @ org.junit.internal.runners.testmethod.invoke(testmethod.java:68) @ org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateimpl$powermockjunit44methodrunner.runtestmethod(powermockjunit44runnerdelegateimpl.java:310) @ org.junit.internal.runners.methodroadie$2.run(methodroadie.java:88) @ org.junit.internal.runners.methodroadie.runbeforesthentestthenafters(methodroadie.java:96) @ org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateimpl$powermockjunit44methodrunner.executetest(powermockjunit44runnerdelegateimpl.java:294) @ org.powermock.modules.junit4.internal.impl.powermockjunit47runnerdelegateimpl$powermockjunit47methodrunner.executetestinsuper(powermockjunit47runnerdelegateimpl.java:127) @ org.powermock.modules.junit4.internal.impl.powermockjunit47runnerdelegateimpl$powermockjunit47methodrunner.executetest(powermockjunit47runnerdelegateimpl.java:82) @ org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateimpl$powermockjunit44methodrunner.runbeforesthentestthenafters(powermockjunit44runnerdelegateimpl.java:282) @ org.junit.internal.runners.methodroadie.runtest(methodroadie.java:86) @ org.junit.internal.runners.methodroadie.run(methodroadie.java:49) @ org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateimpl.invoketestmethod(powermockjunit44runnerdelegateimpl.java:207) @ org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateimpl.runmethods(powermockjunit44runnerdelegateimpl.java:146) @ org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateimpl$1.run(powermockjunit44runnerdelegateimpl.java:120) @ org.junit.internal.runners.classroadie.rununprotected(classroadie.java:33) @ org.junit.internal.runners.classroadie.runprotected(classroadie.java:45) @ org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateimpl.run(powermockjunit44runnerdelegateimpl.java:118) @ org.powermock.modules.junit4.common.internal.impl.junit4testsuitechunkerimpl.run(junit4testsuitechunkerimpl.java:104) @ org.powermock.modules.junit4.common.internal.impl.abstractcommonpowermockrunner.run(abstractcommonpowermockrunner.java:53) @ org.powermock.modules.junit4.powermockrunner.run(powermockrunner.java:53) @ org.apache.maven.surefire.junit4.junit4testset.execute(junit4testset.java:53) @ org.apache.maven.surefire.junit4.junit4provider.executetestset(junit4provider.java:123) @ org.apache.maven.surefire.junit4.junit4provider.invoke(junit4provider.java:104) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:606) @ org.apache.maven.surefire.util.reflectionutils.invokemethodwitharray(reflectionutils.java:164) @ org.apache.maven.surefire.booter.providerfactory$providerproxy.invoke(providerfactory.java:110) @ org.apache.maven.surefire.booter.surefirestarter.invokeprovider(surefirestarter.java:175) @ org.apache.maven.surefire.booter.surefirestarter.runsuitesinprocesswhenforked(surefirestarter.java:107) @ org.apache.maven.surefire.booter.forkedbooter.main(forkedbooter.java:68)

the reason that function beingness called twice rather 1 depends on how service works. maybe service calls dao method more once.

also, note you're using

asserttrue(expected == actual)

where should using

assertequals(expected, actual)

or better

assertthat(actual, is(expected))

java unit-testing powermock easymock

No comments:

Post a Comment