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 use mockito.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