Mockito - difference between doReturn() and when()

java, mockito, unit-testing

Solution

The two syntaxes for stubbing are roughly equivalent. However, you can always use `doReturn/when` for stubbing; but there are cases where you can't use `when/thenReturn`. Stubbing void methods is one such. Others include use with Mockito spies, and stubbing the same method more than once.

One thing that `when/thenReturn` gives you, that `doReturn/when` doesn't, is type-checking of the value that you're returning, at compile time. However, I believe this is of almost no value - if you've got the type wrong, you'll find out as soon as you run your test.

I strongly recommend only using `doReturn/when`. There is no point in learning two syntaxes when one will do.

You may wish to refer to my answer at Forming Mockito "grammars" - a more detailed answer to a very closely related question.

Problem

I am currently in the process of using Mockito to mock my service layer objects in a Spring MVC application in which I want to test my Controller methods. However, as I have been reading on the specifics of Mockito, I have found that the methods `doReturn(...).when(...)` is equivalent to `when(...).thenReturn(...)`. So, my question is what is the point of having two methods that do the same thing or what is the subtle difference between `doReturn(...).when(...)` and `when(...).thenReturn(...)`? Any help would be appreciated.

Original source

Related problems