Mockito: Trying to spy on method is calling the original method Mockito: Trying to spy on method is calling the original method java java

Mockito: Trying to spy on method is calling the original method


Let me quote the official documentation:

Important gotcha on spying real objects!

Sometimes it's impossible to use when(Object) for stubbing spies. Example:

List list = new LinkedList();List spy = spy(list);// Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)when(spy.get(0)).thenReturn("foo");// You have to use doReturn() for stubbingdoReturn("foo").when(spy).get(0);

In your case it goes something like:

doReturn(resultsIWant).when(myClassSpy).method1();


In my case, using Mockito 2.0, I had to change all the any() parameters to nullable() in order to stub the real call.


My case was different from the accepted answer. I was trying to mock a package-private method for an instance that did not live in that package

package common;public class Animal {  void packageProtected();}package instances;class Dog extends Animal { }

and the test classes

package common;public abstract class AnimalTest<T extends Animal> {  @Before  setup(){    doNothing().when(getInstance()).packageProtected();  }  abstract T getInstance();}package instances;class DogTest extends AnimalTest<Dog> {  Dog getInstance(){    return spy(new Dog());  }  @Test  public void myTest(){}}

The compilation is correct, but when it tries to setup the test, it invokes the real method instead.

Declaring the method protected or public fixes the issue, tho it's not a clean solution.