java - I get NotAMockException when trying to partially mock a void method - what am I doing wrong? -
i'm trying use 2 mockito patterns together:
- for partially mocking, use
mockito.spy
. - for mocking methods return void, use
mockito.doxxx(...).when(mock).method(matchers)
, because can't usemockito.when(mock.method(matchers))
syntax obvious reasons (method
returns void can't passed argument)
when combining them, facing notamockexception
. below (contrived) example tested using powermockito 1.6.2 (=mockito 1.10.19) , junit 4.12, , reproduces problem.
public class greeter { // class partially mocking public void helloworld(string hello, set<string> set) { set.add("hello: "+hello); } public void goodbyeworld(string goodbye, set<string> set) { set.add("goodbye: "+goodbye); } } public class exampleclass { // class under test public string hellogoodbye(string input, greeter greeter) { set<string> helloset = new hashset<string>(); set<string> goodbyeset = new hashset<string>(); greeter.helloworld(input, helloset); greeter.goodbyeworld(input, goodbyeset); return (helloset.iterator().next() + ", " + goodbyeset.iterator().next()); } } public class exampleclasstest { @test public void test() { greeter greeter = new greeter(); mockito.spy(greeter); mockito.doanswer(new answer(){ // exception thrown points line @override public void answer(invocationonmock invocation) throws throwable { ((set<string>)invocation.getarguments()[1]).add("bonjour: " + invocation.getarguments()[0]); return null; } }).when(greeter).helloworld(mockito.any(string.class), mockito.any(set.class)); exampleclass example = new exampleclass(); string aggregategreeting = example.hellogoodbye("mars", greeter); assert.assertequals("bonjour: mars, goodbye: mars", aggregategreeting); } }
here full error get:
org.mockito.exceptions.misusing.notamockexception: argument passed when() not mock! example of correct stubbing: dothrow(new runtimeexception()).when(mock).somemethod(); @ com.example.ajb.pmv.exampleclasstest.test(exampleclasstest.java:21) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ org.junit.runners.model.frameworkmethod$1.runreflectivecall(frameworkmethod.java:50) @ org.junit.internal.runners.model.reflectivecallable.run(reflectivecallable.java:12) @ org.junit.runners.model.frameworkmethod.invokeexplosively(frameworkmethod.java:47) @ org.junit.internal.runners.statements.invokemethod.evaluate(invokemethod.java:17) @ org.junit.runners.parentrunner.runleaf(parentrunner.java:325) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:78) @ org.junit.runners.blockjunit4classrunner.runchild(blockjunit4classrunner.java:57) @ org.junit.runners.parentrunner$3.run(parentrunner.java:290) @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:71) @ org.junit.runners.parentrunner.runchildren(parentrunner.java:288) @ org.junit.runners.parentrunner.access$000(parentrunner.java:58) @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:268) @ org.junit.runners.parentrunner.run(parentrunner.java:363) @ org.junit.runner.junitcore.run(junitcore.java:137) @ com.intellij.junit4.junit4ideatestrunner.startrunnerwithargs(junit4ideatestrunner.java:74) @ com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart(junitstarter.java:211) @ com.intellij.rt.execution.junit.junitstarter.main(junitstarter.java:67) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ com.intellij.rt.execution.application.appmain.main(appmain.java:134) process finished exit code -1
any workarounds (other ways achieve goal of mocking single void method within class) welcome!!
you're not passing spy when()
. you're passing original object.
change line
mockito.spy(greeter);
to
greeter = mockito.spy(greeter);
mockito.spy()
creates spy object copy of original object. doesn't modify original object.
Comments
Post a Comment