Mockito - I understand a spy calls the real methods on an object, while a mock calls methods on the double object. Also spies are to be avoided unless there is a code smell.
TL;DR version,
With mock, it creates a bare-bone shell instance for you.
List mockList = Mockito.mock(ArrayList.class);
With spy you can partially mock on an existing instance
List spyList = Mockito.spy(new ArrayList());
Typical use case for Spy: the class has a parameterized constructor, you want to create the object first.