What is the difference between mocking and spying when using Mockito?

java, mocking, mockito, testing

Solution

The answer is in the documentation:

Real partial mocks (Since 1.8.0)

Finally, after many internal debates & discussions on the mailing list, partial mock support was added to Mockito. Previously we considered partial mocks as code smells. However, we found a legitimate use case for partial mocks.

Before release 1.8 spy() was not producing real partial mocks and it was confusing for some users. Read more about spying: here or in javadoc for spy(Object) method.

`callRealMethod()` was introduced after `spy()`, but spy() was left there of course, to ensure backward compatibility.

Otherwise, you're right: all the methods of a spy are real unless stubbed. All the methods of a mock are stubbed unless `callRealMethod()` is called. In general, I would prefer using `callRealMethod()`, because it doesn't force me to use the `doXxx().when()` idiom instead of the traditional `when().thenXxx()`

Problem

What would be a use case for a use of a Mockito spy? It seems to me that every spy use case can be handled with a mock, using callRealMethod. One difference I can see is if you want most method calls to be real, it saves some lines of code to use a mock vs. a spy. Is that it or am I missing the bigger picture?

Original source

Related problems