java - Unexpected method call while using PowerMock- EasyMock -
my problem seems misconception mocking. code test.
public class callhandler { private sqlsessionfactory sessionfactory; public callhandler() { string resource = "mybatis/mybatis-config.xml"; reader reader; seek { reader = resources.getresourceasreader(resource); sessionfactory = new sqlsessionfactorybuilder().build(reader); } grab (ioexception e) { e.printstacktrace(); } } public string handlerequest(call call) { // implementation } } the test class
// have excluded few unnecessary classes @preparefortest post. @runwith(powermockrunner.class) @preparefortest({sqlsessionfactorybuilder.class, resources.class, sqlsessionfactory.class, sqlsession.class}) public class testcase0 extends testcase{ private sqlsessionfactory mockedsessionfactory = powermock.createmock(sqlsessionfactory.class); private sqlsession mockedsession = powermock.createmock(sqlsession.class); private callmapper mockedmapper = powermock.createmock(callmapper.class); private sqlsessionfactorybuilder mockedsqlsessionfactorybuilder= powermock.createmock(sqlsessionfactorybuilder.class); // others @before public void setup() { } @test public void test0 () throws exception { mockstatic(callmapper.class); mockstatic(sqlsessionfactorybuilder.class); mockstatic(resources.class); expect(resources.getresourceasreader("mybatis/mybatis-config.xml")).andreturn(mockedreader); expectnew(sqlsessionfactorybuilder.class).andreturn(mockedsqlsessionfactorybuilder); expect(mockedsqlsessionfactorybuilder.build(mockedreader)).andreturn(mockedsessionfactory); expect(mockedsessionfactory.opensession()).andreturn(mockedsession); // few more expectations replayall(); assertthat(result0).isequalto((new callhandler()).handlerequest(call)); verifyall(); } } this mocking of phone call of build on new sqlsessionfactorybuilder not seem taking effect because of original build() beingness called , hence error. stack trace
java.lang.assertionerror: unexpected method phone call reader.close(); @ org.easymock.internal.mockinvocationhandler.invoke(mockinvocationhandler.java:44) @ org.powermock.api.easymock.internal.invocationcontrol.easymockmethodinvocationcontrol.invoke(easymockmethodinvocationcontrol.java:91) @ org.powermock.core.mockgateway.domethodcall(mockgateway.java:105) @ org.powermock.core.mockgateway.methodcall(mockgateway.java:168) @ org.apache.ibatis.session.sqlsessionfactorybuilder.build(sqlsessionfactorybuilder.java:58) @ org.apache.ibatis.session.sqlsessionfactorybuilder.build(sqlsessionfactorybuilder.java:38) @ com.kwench.integration.ivr.callhandler.<init>(callhandler.java:48) @ in.kwench.integration.ivr.testcase0.test0(testcase0.java:131) @ 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.eclipse.jdt.internal.junit4.runner.junit4testreference.run(junit4testreference.java:50)
without total illustration of code you're testing , test class itself, it's hard issues arising.
having said that, i'm guessing issue haven't prepared classes static methods. these need provided in @preparefortest annotation @ start of test class.
the documentation powermock provides next tips mocking static methods. i'm guessing you've missed out point 2. here source documentation
mocking static methodsquick summary
use @runwith(powermockrunner.class) annotation @ class-level of test case. use @preparefortest(classthatcontainsstaticmethod.class) annotation @ class-level of test case. use powermock.mockstatic(classthatcontainsstaticmethod.class) mock methods of class. use powermock.replay(classthatcontainsstaticmethod.class) alter class replay mode. use powermock.verify(classthatcontainsstaticmethod.class) alter class verify mode.you mocking constructor phone call sqlsessionfactorybuilder you'll need consider tips too. here documentation this
quick summary
use @runwith(powermockrunner.class) annotation @ class-level of test case. use @preparefortest(classthatcreatesthenewinstance.class) annotation @ class-level of test case. use powermock.createmock(newinstanceclass.class) create mock object of class should constructed (let's phone call mockobject). use powermock.expectnew(newinstanceclass.class).andreturn(mockobject) expect new construction of object of type newinstanceclass.class instead homecoming mock object. use powermock.replay(mockobject, newinstanceclass.class) alter mock object , class replay mode, alternatively utilize powermock.replayall() method. use powermock.verify(mockobject, newinstanceclass.class) alter mock object , class verify mode, alternatively utilize powermock.verifyall() method.with tips in mind, produced next test method method provided trying test. test passes fine.
@runwith(powermockrunner.class) @preparefortest({callhandler.class, sqlsessionfactorybuilder.class, resources.class}) public class callhandlertest { private static final string result0 = ""; @test public void test0 () throws exception { final reader mockedreader = easymock.createmock(reader.class); final sqlsessionfactorybuilder mockedsqlsessionfactorybuilder = easymock.createmock(sqlsessionfactorybuilder.class); final sqlsessionfactory mockedsessionfactory = easymock.createmock(sqlsessionfactory.class); powermock.mockstatic(sqlsessionfactorybuilder.class); powermock.mockstatic(resources.class); powermock.expectnew(sqlsessionfactorybuilder.class).andreturn(mockedsqlsessionfactorybuilder); easymock.expect(resources.getresourceasreader("mybatis/mybatis-config.xml")).andreturn(mockedreader); easymock.expect(mockedsqlsessionfactorybuilder.build(mockedreader)).andreturn(mockedsessionfactory); powermock.replayall(); assertthat(result0).isequalto((new callhandler()).handlerequest(new call())); powermock.verifyall(); } } java mocking easymock powermock
No comments:
Post a Comment