Mockito Cheatsheet

Mockito is a great framework for testing in java. I use it all the time and have done for many years now. It works hand in hand with dependnecy injection, a topic I covered in my last blog “Spring for Humans”. However I sometimes find it’s a victim of it’s own success – there’s a lot you can do with it so it’s easy to forget how to do things!

So here’s a cheat sheet which covers most of the features I use in Mockito.

Setting Up Mockito

Using JUnit <5 Annotations

<span>import</span> <span>org.mockito.junit.MockitoJUnitRunner</span><span>;</span>
<span>import</span> <span>org.junit.runner.RunWith</span><span>;</span>
<span>@RunWith</span><span>(</span><span>MockJUnitRunner</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.junit.MockitoJUnitRunner</span><span>;</span>
<span>import</span> <span>org.junit.runner.RunWith</span><span>;</span>

<span>@RunWith</span><span>(</span><span>MockJUnitRunner</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
    <span>...</span>
<span>}</span>
import org.mockito.junit.MockitoJUnitRunner; import org.junit.runner.RunWith; @RunWith(MockJUnitRunner.class) public class MyClassTest { ... }

Enter fullscreen mode Exit fullscreen mode

Using JUnit 5 Annotations

<span>import</span> <span>org.mockito.junit.jupiter.MockitoExtension</span><span>;</span>
<span>import</span> <span>org.junit.jupiter.api.extension.ExtendWith</span><span>;</span>
<span>@ExtendWith</span><span>(</span><span>MockitoExtension</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.junit.jupiter.MockitoExtension</span><span>;</span>
<span>import</span> <span>org.junit.jupiter.api.extension.ExtendWith</span><span>;</span>

<span>@ExtendWith</span><span>(</span><span>MockitoExtension</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
    <span>...</span>
<span>}</span>
import org.mockito.junit.jupiter.MockitoExtension; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(MockitoExtension.class) public class MyClassTest { ... }

Enter fullscreen mode Exit fullscreen mode

Using initMocks

Useful if you need more than one RunWith/Extend (e.g. SpringJunit4ClassRunner)

<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
<span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>}</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>

<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
    <span>@Before</span>
    <span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
        <span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
    <span>}</span>
    <span>...</span>
<span>}</span>
import org.mockito.MockitoAnnotations; import org.junit.Before; public class MyClassTest { @Before public void before() throw Exception { Mockito.initMocks(this); } ... }

Enter fullscreen mode Exit fullscreen mode

Creating Mocks and Spies

An easy way I use to remember the difference between mocks and spies is:

  • Mock: By default, all methods are stubbed unless you say otherwise.

  • Spy: By default, all methods use real implementation unless you say otherwise.

Creating a Mock

Use Annotations on Fields

There seems to be a consensus that this is the cleanest way to mock an object (which goes against my brain’s aversion for field injection, but that’s a story for another day).

<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Mock</span><span>;</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>@Mock</span>
<span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
<span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>// myObject is now a mock</span>
<span>}</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Mock</span><span>;</span>

<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>

    <span>@Mock</span>
    <span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
        <span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>// myObject is now a mock</span>
    <span>}</span>
    <span>...</span>
<span>}</span>
import org.mockito.MockitoAnnotations; import org.junit.Before; import org.mockito.Mock; public class MyClassTest { @Mock private MyClass myObject; @Before public void before() throw Exception { Mockito.initMocks(this); // myObject is now a mock } ... }

Enter fullscreen mode Exit fullscreen mode

Create from Method

<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Mock</span><span>;</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
<span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>myObject</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>MyClass</span><span>.</span><span>class</span><span>);</span>
<span>}</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Mock</span><span>;</span>

<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>

    <span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
        <span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>myObject</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>MyClass</span><span>.</span><span>class</span><span>);</span>
    <span>}</span>
    <span>...</span>
<span>}</span>
import org.mockito.MockitoAnnotations; import org.junit.Before; import org.mockito.Mock; public class MyClassTest { private MyClass myObject; @Before public void before() throw Exception { Mockito.initMocks(this); myObject = Mockito.mock(MyClass.class); } ... }

Enter fullscreen mode Exit fullscreen mode

Create from Method using Initialised Object

Useful if you want a mock to be created from an object which has been constructed using a constructor.

<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Mock</span><span>;</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>private</span> <span>Person</span> <span>person</span> <span>=</span> <span>Person</span><span>(</span><span>"name"</span><span>,</span> <span>18</span><span>);</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
<span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>person</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>person</span><span>);</span>
<span>}</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Mock</span><span>;</span>

<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>

    <span>private</span> <span>Person</span> <span>person</span> <span>=</span> <span>Person</span><span>(</span><span>"name"</span><span>,</span> <span>18</span><span>);</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
        <span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>person</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>person</span><span>);</span>
    <span>}</span>
    <span>...</span>
<span>}</span>
import org.mockito.MockitoAnnotations; import org.junit.Before; import org.mockito.Mock; public class MyClassTest { private Person person = Person("name", 18); @Before public void before() throw Exception { Mockito.initMocks(this); person = Mockito.mock(person); } ... }

Enter fullscreen mode Exit fullscreen mode

Creating a Spy

This is very similar to mocks.

Use Annotations on Fields

<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Spy</span><span>;</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>@Spy</span>
<span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
<span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>// myObject is now a spy</span>
<span>}</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Spy</span><span>;</span>

<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>

    <span>@Spy</span>
    <span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
        <span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>// myObject is now a spy</span>
    <span>}</span>
    <span>...</span>
<span>}</span>
import org.mockito.MockitoAnnotations; import org.junit.Before; import org.mockito.Spy; public class MyClassTest { @Spy private MyClass myObject; @Before public void before() throw Exception { Mockito.initMocks(this); // myObject is now a spy } ... }

Enter fullscreen mode Exit fullscreen mode

Create from Method

<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Spy</span><span>;</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
<span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>myObject</span> <span>=</span> <span>Mockito</span><span>.</span><span>spy</span><span>(</span><span>MyClass</span><span>.</span><span>class</span><span>);</span>
<span>}</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Spy</span><span>;</span>

<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>

    <span>private</span> <span>MyClass</span> <span>myObject</span><span>;</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
        <span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>myObject</span> <span>=</span> <span>Mockito</span><span>.</span><span>spy</span><span>(</span><span>MyClass</span><span>.</span><span>class</span><span>);</span>
    <span>}</span>
    <span>...</span>
<span>}</span>
import org.mockito.MockitoAnnotations; import org.junit.Before; import org.mockito.Spy; public class MyClassTest { private MyClass myObject; @Before public void before() throw Exception { Mockito.initMocks(this); myObject = Mockito.spy(MyClass.class); } ... }

Enter fullscreen mode Exit fullscreen mode

Create from method using Initialised Object

Useful if you want a spy to be created from an object which has been constructed using a constructor.

<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Spy</span><span>;</span>
<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>
<span>private</span> <span>Person</span> <span>person</span> <span>=</span> <span>Person</span><span>(</span><span>"name"</span><span>,</span> <span>18</span><span>);</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
<span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>person</span> <span>=</span> <span>Mockito</span><span>.</span><span>spy</span><span>(</span><span>person</span><span>);</span>
<span>}</span>
<span>...</span>
<span>}</span>
<span>import</span> <span>org.mockito.MockitoAnnotations</span><span>;</span>
<span>import</span> <span>org.junit.Before</span><span>;</span>
<span>import</span> <span>org.mockito.Spy</span><span>;</span>

<span>public</span> <span>class</span> <span>MyClassTest</span> <span>{</span>

    <span>private</span> <span>Person</span> <span>person</span> <span>=</span> <span>Person</span><span>(</span><span>"name"</span><span>,</span> <span>18</span><span>);</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>before</span><span>()</span> <span>throw</span> <span>Exception</span> <span>{</span>
        <span>Mockito</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>person</span> <span>=</span> <span>Mockito</span><span>.</span><span>spy</span><span>(</span><span>person</span><span>);</span>
    <span>}</span>
    <span>...</span>
<span>}</span>
import org.mockito.MockitoAnnotations; import org.junit.Before; import org.mockito.Spy; public class MyClassTest { private Person person = Person("name", 18); @Before public void before() throw Exception { Mockito.initMocks(this); person = Mockito.spy(person); } ... }

Enter fullscreen mode Exit fullscreen mode

Injecting Mocks

Using @InjectMocks Annotation

<span>public</span> <span>class</span> <span>InjectTest</span> <span>{</span>
<span>@Mock</span>
<span>private</span> <span>BlogRepository</span> <span>blogRepository</span><span>;</span>
<span>@InjectMocks</span>
<span>private</span> <span>BlogPostService</span> <span>blogPostService</span><span>;</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>setup</span><span>()</span> <span>{</span>
<span>MockitoAnnotations</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>blogPostService</span><span>);</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>InjectTest</span> <span>{</span>

    <span>@Mock</span>
    <span>private</span> <span>BlogRepository</span> <span>blogRepository</span><span>;</span>
    <span>@InjectMocks</span>
    <span>private</span> <span>BlogPostService</span> <span>blogPostService</span><span>;</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>setup</span><span>()</span> <span>{</span>
        <span>MockitoAnnotations</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>blogPostService</span><span>);</span>
    <span>}</span>
<span>}</span>
public class InjectTest { @Mock private BlogRepository blogRepository; @InjectMocks private BlogPostService blogPostService; @Before public void setup() { MockitoAnnotations.initMocks(this); System.out.println(blogPostService); } }

Enter fullscreen mode Exit fullscreen mode

Using Constructor

<span>public</span> <span>class</span> <span>InjectTest</span> <span>{</span>
<span>@Mock</span>
<span>private</span> <span>BlogRepository</span> <span>blogRepository</span><span>;</span>
<span>@InjectMocks</span>
<span>private</span> <span>BlogPostService</span> <span>blogPostService</span><span>;</span>
<span>@Before</span>
<span>public</span> <span>void</span> <span>setup</span><span>()</span> <span>{</span>
<span>MockitoAnnotations</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
<span>blogPostService</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>}</span>
<span>}</span>
<span>public</span> <span>class</span> <span>InjectTest</span> <span>{</span>

    <span>@Mock</span>
    <span>private</span> <span>BlogRepository</span> <span>blogRepository</span><span>;</span>
    <span>@InjectMocks</span>
    <span>private</span> <span>BlogPostService</span> <span>blogPostService</span><span>;</span>

    <span>@Before</span>
    <span>public</span> <span>void</span> <span>setup</span><span>()</span> <span>{</span>
        <span>MockitoAnnotations</span><span>.</span><span>initMocks</span><span>(</span><span>this</span><span>);</span>
        <span>blogPostService</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
    <span>}</span>
<span>}</span>
public class InjectTest { @Mock private BlogRepository blogRepository; @InjectMocks private BlogPostService blogPostService; @Before public void setup() { MockitoAnnotations.initMocks(this); blogPostService = new BlogPostService(blogRepository); } }

Enter fullscreen mode Exit fullscreen mode

Stubbing a method

Returning from a stubbed Method

<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPostsInDb_returnsBlogPosts</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>),</span>
<span>new</span> <span>BlogPost</span><span>(</span><span>"Mockito Cheatsheet"</span><span>));</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>()).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getAllBlogPosts</span><span>();</span>
<span>// assert</span>
<span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPostsInDb_returnsBlogPosts</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>),</span> 
            <span>new</span> <span>BlogPost</span><span>(</span><span>"Mockito Cheatsheet"</span><span>));</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>()).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getAllBlogPosts</span><span>();</span>

    <span>// assert</span>
    <span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
@Test public void getAllBlogPosts_withBlogPostsInDb_returnsBlogPosts() { // arrange List<BlogPost> expected = Arrays.asList(new BlogPost("Spring for humans"), new BlogPost("Mockito Cheatsheet")); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Mockito.when(blogRepository.getAllBlogPosts()).thenReturn(expected); BlogPostService service = new BlogPostService(blogRepository); // act List<BlogPost> actual = service.getAllBlogPosts(); // assert assertEquals(expected, actual); }

Enter fullscreen mode Exit fullscreen mode

Providing an Alternative Implementation for a Method

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withExistingBlogPostInDb_returnsBlogPost</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogPost</span> <span>expected</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>);</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>Mockito</span><span>.</span><span>anyInt</span><span>())).</span><span>thenAnswer</span><span>(</span><span>invocationOnMock</span> <span>-></span> <span>{</span>
<span>int</span> <span>id</span> <span>=</span> <span>invocationOnMock</span><span>.</span><span>getArgument</span><span>(</span><span>0</span><span>);</span>
<span>if</span><span>(</span><span>id</span> <span>==</span> <span>1</span><span>)</span> <span>return</span> <span>Optional</span><span>.</span><span>of</span><span>(</span><span>expected</span><span>);</span>
<span>else</span> <span>return</span> <span>Optional</span><span>.</span><span>empty</span><span>();</span>
<span>});</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>BlogPost</span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>).</span><span>get</span><span>();</span>
<span>// assert</span>
<span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withExistingBlogPostInDb_returnsBlogPost</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogPost</span> <span>expected</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>);</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>Mockito</span><span>.</span><span>anyInt</span><span>())).</span><span>thenAnswer</span><span>(</span><span>invocationOnMock</span> <span>-></span> <span>{</span>
        <span>int</span> <span>id</span> <span>=</span> <span>invocationOnMock</span><span>.</span><span>getArgument</span><span>(</span><span>0</span><span>);</span>
        <span>if</span><span>(</span><span>id</span> <span>==</span> <span>1</span><span>)</span> <span>return</span> <span>Optional</span><span>.</span><span>of</span><span>(</span><span>expected</span><span>);</span>
        <span>else</span> <span>return</span> <span>Optional</span><span>.</span><span>empty</span><span>();</span>
    <span>});</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>BlogPost</span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>).</span><span>get</span><span>();</span>

    <span>// assert</span>
    <span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
@Test public void getBlogPostById_withExistingBlogPostInDb_returnsBlogPost() { // arrange BlogPost expected = new BlogPost("Spring for Humans"); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Mockito.when(blogRepository.getBlogPostById(Mockito.anyInt())).thenAnswer(invocationOnMock -> { int id = invocationOnMock.getArgument(0); if(id == 1) return Optional.of(expected); else return Optional.empty(); }); BlogPostService service = new BlogPostService(blogRepository); // act BlogPost actual = service.getBlogPostById(1).get(); // assert assertEquals(expected, actual); }

Enter fullscreen mode Exit fullscreen mode

Throwing an Exception from a Method

<span>@Test</span><span>(</span><span>expected</span> <span>=</span> <span>IllegalArgumentException</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withMissingBlogPost_throwsException</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogPost</span> <span>expected</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>);</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>)).</span><span>thenThrow</span><span>(</span><span>new</span> <span>IllegalArgumentException</span><span>());</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>BlogPost</span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>).</span><span>get</span><span>();</span>
<span>// assert</span>
<span>// Test will pass if exception of type IllegalArgumentException is thrown</span>
<span>}</span>
<span>@Test</span><span>(</span><span>expected</span> <span>=</span> <span>IllegalArgumentException</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withMissingBlogPost_throwsException</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogPost</span> <span>expected</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>);</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>)).</span><span>thenThrow</span><span>(</span><span>new</span> <span>IllegalArgumentException</span><span>());</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>BlogPost</span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>).</span><span>get</span><span>();</span>

    <span>// assert</span>
    <span>// Test will pass if exception of type IllegalArgumentException is thrown</span>
<span>}</span>
@Test(expected = IllegalArgumentException.class) public void getBlogPostById_withMissingBlogPost_throwsException() { // arrange BlogPost expected = new BlogPost("Spring for Humans"); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Mockito.when(blogRepository.getBlogPostById(1)).thenThrow(new IllegalArgumentException()); BlogPostService service = new BlogPostService(blogRepository); // act BlogPost actual = service.getBlogPostById(1).get(); // assert // Test will pass if exception of type IllegalArgumentException is thrown }

Enter fullscreen mode Exit fullscreen mode

Calling the Real Implementation

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withMissingBlogPost_returnsEmpty</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>)).</span><span>thenCallRealMethod</span><span>();</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>Optional</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>);</span>
<span>// assert</span>
<span>assertFalse</span><span>(</span><span>actual</span><span>.</span><span>isPresent</span><span>());</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withMissingBlogPost_returnsEmpty</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>)).</span><span>thenCallRealMethod</span><span>();</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>Optional</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>);</span>

    <span>// assert</span>
    <span>assertFalse</span><span>(</span><span>actual</span><span>.</span><span>isPresent</span><span>());</span>
<span>}</span>
@Test public void getBlogPostById_withMissingBlogPost_returnsEmpty() { // arrange BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Mockito.when(blogRepository.getBlogPostById(1)).thenCallRealMethod(); BlogPostService service = new BlogPostService(blogRepository); // act Optional<BlogPost> actual = service.getBlogPostById(1); // assert assertFalse(actual.isPresent()); }

Enter fullscreen mode Exit fullscreen mode

Using Deep Stubs

Deep stubs are used for methods which are chained, but you don’t care about the intermediate values. These should be used sparingly, as discussed in the Mockito documentation.

<span>// Without deep stubs</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>checkIfDriverIsPostgres_withPostgresDriver_returnsTrue</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
<span>RepositoryConfiguration</span> <span>repositoryConfigMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>RepositoryConfiguration</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>configMock</span><span>.</span><span>getRepositoryConfiguration</span><span>()).</span><span>thenReturn</span><span>(</span><span>repositoryConfigMock</span><span>);</span>
<span>DatabaseConfiguration</span> <span>databaseConfigMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>DatabaseConfiguration</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>repositoryConfigMock</span><span>.</span><span>getDatabaseConfiguration</span><span>()).</span><span>thenReturn</span><span>(</span><span>databaseConfigMock</span><span>);</span>
<span>DatabaseConfiguration</span><span>.</span><span>DriverConfiguration</span> <span>driverConfigMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>DatabaseConfiguration</span><span>.</span><span>DriverConfiguration</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>databaseConfigMock</span><span>.</span><span>getDriverConfiguration</span><span>()).</span><span>thenReturn</span><span>(</span><span>driverConfigMock</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>driverConfigMock</span><span>.</span><span>getDriverType</span><span>()).</span><span>thenReturn</span><span>(</span><span>"postgres"</span><span>);</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>
<span>// act</span>
<span>boolean</span> <span>actual</span> <span>=</span> <span>blogRepository</span><span>.</span><span>checkIfDriverIsPostgres</span><span>();</span>
<span>// assert</span>
<span>Assert</span><span>.</span><span>assertTrue</span><span>(</span><span>actual</span><span>);</span>
<span>}</span>
<span>// With deep stubs</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>usingDeepStubs_checkIfDriverIsPostgres_withPostgresDriver_returnsTrue</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>,</span> <span>Mockito</span><span>.</span><span>RETURNS_DEEP_STUBS</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>configMock</span><span>.</span><span>getRepositoryConfiguration</span><span>()</span>
<span>.</span><span>getDatabaseConfiguration</span><span>().</span><span>getDriverConfiguration</span><span>().</span><span>getDriverType</span><span>()).</span><span>thenReturn</span><span>(</span><span>"postgres"</span><span>);</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>
<span>// act</span>
<span>boolean</span> <span>actual</span> <span>=</span> <span>blogRepository</span><span>.</span><span>checkIfDriverIsPostgres</span><span>();</span>
<span>// assert</span>
<span>Assert</span><span>.</span><span>assertTrue</span><span>(</span><span>actual</span><span>);</span>
<span>}</span>
<span>// Without deep stubs</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>checkIfDriverIsPostgres_withPostgresDriver_returnsTrue</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
    <span>RepositoryConfiguration</span> <span>repositoryConfigMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>RepositoryConfiguration</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>configMock</span><span>.</span><span>getRepositoryConfiguration</span><span>()).</span><span>thenReturn</span><span>(</span><span>repositoryConfigMock</span><span>);</span>
    <span>DatabaseConfiguration</span> <span>databaseConfigMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>DatabaseConfiguration</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>repositoryConfigMock</span><span>.</span><span>getDatabaseConfiguration</span><span>()).</span><span>thenReturn</span><span>(</span><span>databaseConfigMock</span><span>);</span>
    <span>DatabaseConfiguration</span><span>.</span><span>DriverConfiguration</span> <span>driverConfigMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>DatabaseConfiguration</span><span>.</span><span>DriverConfiguration</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>databaseConfigMock</span><span>.</span><span>getDriverConfiguration</span><span>()).</span><span>thenReturn</span><span>(</span><span>driverConfigMock</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>driverConfigMock</span><span>.</span><span>getDriverType</span><span>()).</span><span>thenReturn</span><span>(</span><span>"postgres"</span><span>);</span>

    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>

    <span>// act</span>
    <span>boolean</span> <span>actual</span> <span>=</span> <span>blogRepository</span><span>.</span><span>checkIfDriverIsPostgres</span><span>();</span>

    <span>// assert</span>
    <span>Assert</span><span>.</span><span>assertTrue</span><span>(</span><span>actual</span><span>);</span>
<span>}</span>

<span>// With deep stubs</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>usingDeepStubs_checkIfDriverIsPostgres_withPostgresDriver_returnsTrue</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>,</span> <span>Mockito</span><span>.</span><span>RETURNS_DEEP_STUBS</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>configMock</span><span>.</span><span>getRepositoryConfiguration</span><span>()</span>
            <span>.</span><span>getDatabaseConfiguration</span><span>().</span><span>getDriverConfiguration</span><span>().</span><span>getDriverType</span><span>()).</span><span>thenReturn</span><span>(</span><span>"postgres"</span><span>);</span>

    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>

    <span>// act</span>
    <span>boolean</span> <span>actual</span> <span>=</span> <span>blogRepository</span><span>.</span><span>checkIfDriverIsPostgres</span><span>();</span>

    <span>// assert</span>
    <span>Assert</span><span>.</span><span>assertTrue</span><span>(</span><span>actual</span><span>);</span>
<span>}</span>
// Without deep stubs @Test public void checkIfDriverIsPostgres_withPostgresDriver_returnsTrue() { // arrange Configuration configMock = Mockito.mock(Configuration.class); RepositoryConfiguration repositoryConfigMock = Mockito.mock(RepositoryConfiguration.class); Mockito.when(configMock.getRepositoryConfiguration()).thenReturn(repositoryConfigMock); DatabaseConfiguration databaseConfigMock = Mockito.mock(DatabaseConfiguration.class); Mockito.when(repositoryConfigMock.getDatabaseConfiguration()).thenReturn(databaseConfigMock); DatabaseConfiguration.DriverConfiguration driverConfigMock = Mockito.mock(DatabaseConfiguration.DriverConfiguration.class); Mockito.when(databaseConfigMock.getDriverConfiguration()).thenReturn(driverConfigMock); Mockito.when(driverConfigMock.getDriverType()).thenReturn("postgres"); BlogRepository blogRepository = new BlogRepository(configMock); // act boolean actual = blogRepository.checkIfDriverIsPostgres(); // assert Assert.assertTrue(actual); } // With deep stubs @Test public void usingDeepStubs_checkIfDriverIsPostgres_withPostgresDriver_returnsTrue() { // arrange Configuration configMock = Mockito.mock(Configuration.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(configMock.getRepositoryConfiguration() .getDatabaseConfiguration().getDriverConfiguration().getDriverType()).thenReturn("postgres"); BlogRepository blogRepository = new BlogRepository(configMock); // act boolean actual = blogRepository.checkIfDriverIsPostgres(); // assert Assert.assertTrue(actual); }

Enter fullscreen mode Exit fullscreen mode

Stubbing a Void Method

Providing an Alternative Implementation for a Method

<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPostsInDb_callsVerifyConnectionToDatabaseIsAlive</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>
<span>AtomicBoolean</span> <span>verifyMethodCalled</span> <span>=</span> <span>new</span> <span>AtomicBoolean</span><span>(</span><span>false</span><span>);</span>
<span>Mockito</span><span>.</span><span>doAnswer</span><span>(</span><span>invocationOnMock</span> <span>-></span> <span>{</span>
<span>// We can do whatever we want here, and it will be executed when</span>
<span>// verifyConnectionToDatabaseIsAlive</span>
<span>// If the method had any arguments, we can capture them here</span>
<span>verifyMethodCalled</span><span>.</span><span>set</span><span>(</span><span>true</span><span>);</span>
<span>return</span> <span>null</span><span>;</span>
<span>}).</span><span>when</span><span>(</span><span>configMock</span><span>).</span><span>verifyConnectionToDatabaseIsAlive</span><span>();</span>
<span>// act</span>
<span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>();</span>
<span>// assert</span>
<span>assertTrue</span><span>(</span><span>verifyMethodCalled</span><span>.</span><span>get</span><span>());</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPostsInDb_callsVerifyConnectionToDatabaseIsAlive</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>

    <span>AtomicBoolean</span> <span>verifyMethodCalled</span> <span>=</span> <span>new</span> <span>AtomicBoolean</span><span>(</span><span>false</span><span>);</span>
    <span>Mockito</span><span>.</span><span>doAnswer</span><span>(</span><span>invocationOnMock</span> <span>-></span> <span>{</span>
        <span>// We can do whatever we want here, and it will be executed when</span>
        <span>// verifyConnectionToDatabaseIsAlive</span>
        <span>// If the method had any arguments, we can capture them here</span>
        <span>verifyMethodCalled</span><span>.</span><span>set</span><span>(</span><span>true</span><span>);</span>
        <span>return</span> <span>null</span><span>;</span>
    <span>}).</span><span>when</span><span>(</span><span>configMock</span><span>).</span><span>verifyConnectionToDatabaseIsAlive</span><span>();</span>

    <span>// act</span>
    <span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>();</span>

    <span>// assert</span>
    <span>assertTrue</span><span>(</span><span>verifyMethodCalled</span><span>.</span><span>get</span><span>());</span>
<span>}</span>
@Test public void getAllBlogPosts_withBlogPostsInDb_callsVerifyConnectionToDatabaseIsAlive() { // arrange Configuration configMock = Mockito.mock(Configuration.class); BlogRepository blogRepository = new BlogRepository(configMock); AtomicBoolean verifyMethodCalled = new AtomicBoolean(false); Mockito.doAnswer(invocationOnMock -> { // We can do whatever we want here, and it will be executed when // verifyConnectionToDatabaseIsAlive // If the method had any arguments, we can capture them here verifyMethodCalled.set(true); return null; }).when(configMock).verifyConnectionToDatabaseIsAlive(); // act blogRepository.getAllBlogPosts(); // assert assertTrue(verifyMethodCalled.get()); }

Enter fullscreen mode Exit fullscreen mode

Throwing an Exception from a Method

<span>@Test</span><span>(</span><span>expected</span> <span>=</span> <span>DatabaseDownException</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withConnectionToDbDown_throwsException</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>
<span>AtomicBoolean</span> <span>verifyMethodCalled</span> <span>=</span> <span>new</span> <span>AtomicBoolean</span><span>(</span><span>false</span><span>);</span>
<span>Mockito</span><span>.</span><span>doThrow</span><span>(</span><span>new</span> <span>DatabaseDownException</span><span>()).</span><span>when</span><span>(</span><span>configMock</span><span>).</span><span>verifyConnectionToDatabaseIsAlive</span><span>();</span>
<span>// act</span>
<span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>();</span>
<span>// assert</span>
<span>// Test will pass if exception of type DatabaseDownException is thrown</span>
<span>}</span>
<span>@Test</span><span>(</span><span>expected</span> <span>=</span> <span>DatabaseDownException</span><span>.</span><span>class</span><span>)</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withConnectionToDbDown_throwsException</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>

    <span>AtomicBoolean</span> <span>verifyMethodCalled</span> <span>=</span> <span>new</span> <span>AtomicBoolean</span><span>(</span><span>false</span><span>);</span>
    <span>Mockito</span><span>.</span><span>doThrow</span><span>(</span><span>new</span> <span>DatabaseDownException</span><span>()).</span><span>when</span><span>(</span><span>configMock</span><span>).</span><span>verifyConnectionToDatabaseIsAlive</span><span>();</span>

    <span>// act</span>
    <span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>();</span>

    <span>// assert</span>
    <span>// Test will pass if exception of type DatabaseDownException is thrown</span>
<span>}</span>
@Test(expected = DatabaseDownException.class) public void getAllBlogPosts_withConnectionToDbDown_throwsException() { // arrange Configuration configMock = Mockito.mock(Configuration.class); BlogRepository blogRepository = new BlogRepository(configMock); AtomicBoolean verifyMethodCalled = new AtomicBoolean(false); Mockito.doThrow(new DatabaseDownException()).when(configMock).verifyConnectionToDatabaseIsAlive(); // act blogRepository.getAllBlogPosts(); // assert // Test will pass if exception of type DatabaseDownException is thrown }

Enter fullscreen mode Exit fullscreen mode

Calling the Real Implementation

<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPostsInDb_returnsBlogPosts</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>
<span>AtomicBoolean</span> <span>verifyMethodCalled</span> <span>=</span> <span>new</span> <span>AtomicBoolean</span><span>(</span><span>false</span><span>);</span>
<span>Mockito</span><span>.</span><span>doCallRealMethod</span><span>().</span><span>when</span><span>(</span><span>configMock</span><span>).</span><span>verifyConnectionToDatabaseIsAlive</span><span>();</span>
<span>// act</span>
<span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>();</span>
<span>// assert</span>
<span>// Test will pass if exception of type DatabaseDownException is thrown</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPostsInDb_returnsBlogPosts</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>Configuration</span> <span>configMock</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>Configuration</span><span>.</span><span>class</span><span>);</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>new</span> <span>BlogRepository</span><span>(</span><span>configMock</span><span>);</span>

    <span>AtomicBoolean</span> <span>verifyMethodCalled</span> <span>=</span> <span>new</span> <span>AtomicBoolean</span><span>(</span><span>false</span><span>);</span>
    <span>Mockito</span><span>.</span><span>doCallRealMethod</span><span>().</span><span>when</span><span>(</span><span>configMock</span><span>).</span><span>verifyConnectionToDatabaseIsAlive</span><span>();</span>

    <span>// act</span>
    <span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>();</span>

    <span>// assert</span>
    <span>// Test will pass if exception of type DatabaseDownException is thrown</span>
<span>}</span>
@Test public void getAllBlogPosts_withBlogPostsInDb_returnsBlogPosts() { // arrange Configuration configMock = Mockito.mock(Configuration.class); BlogRepository blogRepository = new BlogRepository(configMock); AtomicBoolean verifyMethodCalled = new AtomicBoolean(false); Mockito.doCallRealMethod().when(configMock).verifyConnectionToDatabaseIsAlive(); // act blogRepository.getAllBlogPosts(); // assert // Test will pass if exception of type DatabaseDownException is thrown }

Enter fullscreen mode Exit fullscreen mode

Matchers

Using a Real Parameter

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withExistingBlogPostsInDb_returnsBlogPosts</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Collections</span><span>.</span><span>singletonList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>));</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Date</span> <span>date</span> <span>=</span> <span>new</span> <span>Date</span><span>();</span>
<span>String</span> <span>author</span> <span>=</span> <span>"Shane"</span><span>;</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>author</span><span>,</span> <span>date</span><span>)).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>author</span><span>,</span> <span>date</span><span>);</span>
<span>// assert</span>
<span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withExistingBlogPostsInDb_returnsBlogPosts</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Collections</span><span>.</span><span>singletonList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>));</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Date</span> <span>date</span> <span>=</span> <span>new</span> <span>Date</span><span>();</span>
    <span>String</span> <span>author</span> <span>=</span> <span>"Shane"</span><span>;</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>author</span><span>,</span> <span>date</span><span>)).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>author</span><span>,</span> <span>date</span><span>);</span>

    <span>// assert</span>
    <span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
@Test public void getBlogPostByAuthorAndAfterDate_withExistingBlogPostsInDb_returnsBlogPosts() { // arrange List<BlogPost> expected = Collections.singletonList(new BlogPost("Spring for Humans")); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Date date = new Date(); String author = "Shane"; Mockito.when(blogRepository.getBlogPostsByAuthorAndAfterDate(author, date)).thenReturn(expected); BlogPostService service = new BlogPostService(blogRepository); // act List<BlogPost> actual = service.getBlogPostsByAuthorAndAfterDate(author, date); // assert assertEquals(expected, actual); }

Enter fullscreen mode Exit fullscreen mode

Using any()

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withoutMatchingBlogPostsInDb_returnsEmptyList</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>Mockito</span><span>.</span><span>any</span><span>(),</span> <span>Mockito</span><span>.</span><span>any</span><span>())).</span><span>thenReturn</span><span>(</span><span>Collections</span><span>.</span><span>emptyList</span><span>());</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>"any author"</span><span>,</span> <span>new</span> <span>Date</span><span>());</span>
<span>// assert</span>
<span>assertTrue</span><span>(</span><span>actual</span><span>.</span><span>isEmpty</span><span>());</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withoutMatchingBlogPostsInDb_returnsEmptyList</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>Mockito</span><span>.</span><span>any</span><span>(),</span> <span>Mockito</span><span>.</span><span>any</span><span>())).</span><span>thenReturn</span><span>(</span><span>Collections</span><span>.</span><span>emptyList</span><span>());</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>"any author"</span><span>,</span> <span>new</span> <span>Date</span><span>());</span>

    <span>// assert</span>
    <span>assertTrue</span><span>(</span><span>actual</span><span>.</span><span>isEmpty</span><span>());</span>
<span>}</span>
@Test public void getBlogPostByAuthorAndAfterDate_withoutMatchingBlogPostsInDb_returnsEmptyList() { // arrange BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Mockito.when(blogRepository.getBlogPostsByAuthorAndAfterDate(Mockito.any(), Mockito.any())).thenReturn(Collections.emptyList()); BlogPostService service = new BlogPostService(blogRepository); // act List<BlogPost> actual = service.getBlogPostsByAuthorAndAfterDate("any author", new Date()); // assert assertTrue(actual.isEmpty()); }

Enter fullscreen mode Exit fullscreen mode

Using anyClass()

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withMatchingAuthorAndDate_returnsPostsSortedByDate</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogPost</span> <span>first</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>5</span><span>));</span>
<span>BlogPost</span> <span>second</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Mockito Cheatsheet"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>6</span><span>));</span>
<span>BlogPost</span> <span>third</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"?"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>7</span><span>));</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>// Good for overloaded methods, you can specify type of params so the call isn't ambiguous.</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>Mockito</span><span>.</span><span>any</span><span>(</span><span>String</span><span>.</span><span>class</span><span>),</span> <span>Mockito</span><span>.</span><span>any</span><span>(</span><span>Date</span><span>.</span><span>class</span><span>)))</span>
<span>.</span><span>thenReturn</span><span>(</span><span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>second</span><span>,</span> <span>third</span><span>,</span> <span>first</span><span>));</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>first</span><span>,</span> <span>second</span><span>,</span> <span>third</span><span>);</span>
<span>// act</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>"any author"</span><span>,</span> <span>new</span> <span>Date</span><span>());</span>
<span>// assert</span>
<span>assertEquals</span><span>(</span><span>expected</span><span>.</span><span>get</span><span>(</span><span>0</span><span>),</span> <span>actual</span><span>.</span><span>get</span><span>(</span><span>0</span><span>));</span>
<span>assertEquals</span><span>(</span><span>expected</span><span>.</span><span>get</span><span>(</span><span>1</span><span>),</span> <span>actual</span><span>.</span><span>get</span><span>(</span><span>1</span><span>));</span>
<span>assertEquals</span><span>(</span><span>expected</span><span>.</span><span>get</span><span>(</span><span>2</span><span>),</span> <span>actual</span><span>.</span><span>get</span><span>(</span><span>2</span><span>));</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withMatchingAuthorAndDate_returnsPostsSortedByDate</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogPost</span> <span>first</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>5</span><span>));</span>
    <span>BlogPost</span> <span>second</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Mockito Cheatsheet"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>6</span><span>));</span>
    <span>BlogPost</span> <span>third</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"?"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>7</span><span>));</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>// Good for overloaded methods, you can specify type of params so the call isn't ambiguous.</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>Mockito</span><span>.</span><span>any</span><span>(</span><span>String</span><span>.</span><span>class</span><span>),</span> <span>Mockito</span><span>.</span><span>any</span><span>(</span><span>Date</span><span>.</span><span>class</span><span>)))</span>
            <span>.</span><span>thenReturn</span><span>(</span><span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>second</span><span>,</span> <span>third</span><span>,</span> <span>first</span><span>));</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>first</span><span>,</span> <span>second</span><span>,</span> <span>third</span><span>);</span>

    <span>// act</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>"any author"</span><span>,</span> <span>new</span> <span>Date</span><span>());</span>

    <span>// assert</span>
    <span>assertEquals</span><span>(</span><span>expected</span><span>.</span><span>get</span><span>(</span><span>0</span><span>),</span> <span>actual</span><span>.</span><span>get</span><span>(</span><span>0</span><span>));</span>
    <span>assertEquals</span><span>(</span><span>expected</span><span>.</span><span>get</span><span>(</span><span>1</span><span>),</span> <span>actual</span><span>.</span><span>get</span><span>(</span><span>1</span><span>));</span>
    <span>assertEquals</span><span>(</span><span>expected</span><span>.</span><span>get</span><span>(</span><span>2</span><span>),</span> <span>actual</span><span>.</span><span>get</span><span>(</span><span>2</span><span>));</span>
<span>}</span>
@Test public void getBlogPostByAuthorAndAfterDate_withMatchingAuthorAndDate_returnsPostsSortedByDate() { // arrange BlogPost first = new BlogPost("Spring for Humans", "Shane", new Date(5)); BlogPost second = new BlogPost("Mockito Cheatsheet", "Shane", new Date(6)); BlogPost third = new BlogPost("?", "Shane", new Date(7)); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); // Good for overloaded methods, you can specify type of params so the call isn't ambiguous. Mockito.when(blogRepository.getBlogPostsByAuthorAndAfterDate(Mockito.any(String.class), Mockito.any(Date.class))) .thenReturn(Arrays.asList(second, third, first)); BlogPostService service = new BlogPostService(blogRepository); List<BlogPost> expected = Arrays.asList(first, second, third); // act List<BlogPost> actual = service.getBlogPostsByAuthorAndAfterDate("any author", new Date()); // assert assertEquals(expected.get(0), actual.get(0)); assertEquals(expected.get(1), actual.get(1)); assertEquals(expected.get(2), actual.get(2)); }

Enter fullscreen mode Exit fullscreen mode

Using eq()

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withMatchingAuthorButFutureDate_returnsEmptyList</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Collections</span><span>.</span><span>singletonList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>));</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Date</span> <span>date</span> <span>=</span> <span>new</span> <span>Date</span><span>();</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>Mockito</span><span>.</span><span>any</span><span>(),</span> <span>Mockito</span><span>.</span><span>eq</span><span>(</span><span>date</span><span>))).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>"any author"</span><span>,</span> <span>date</span><span>);</span>
<span>// assert</span>
<span>assertTrue</span><span>(</span><span>actual</span><span>.</span><span>isEmpty</span><span>());</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostByAuthorAndAfterDate_withMatchingAuthorButFutureDate_returnsEmptyList</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Collections</span><span>.</span><span>singletonList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>));</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Date</span> <span>date</span> <span>=</span> <span>new</span> <span>Date</span><span>();</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>Mockito</span><span>.</span><span>any</span><span>(),</span> <span>Mockito</span><span>.</span><span>eq</span><span>(</span><span>date</span><span>))).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>getBlogPostsByAuthorAndAfterDate</span><span>(</span><span>"any author"</span><span>,</span> <span>date</span><span>);</span>

    <span>// assert</span>
    <span>assertTrue</span><span>(</span><span>actual</span><span>.</span><span>isEmpty</span><span>());</span>
<span>}</span>
@Test public void getBlogPostByAuthorAndAfterDate_withMatchingAuthorButFutureDate_returnsEmptyList() { // arrange List<BlogPost> expected = Collections.singletonList(new BlogPost("Spring for Humans")); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Date date = new Date(); Mockito.when(blogRepository.getBlogPostsByAuthorAndAfterDate(Mockito.any(), Mockito.eq(date))).thenReturn(expected); BlogPostService service = new BlogPostService(blogRepository); // act List<BlogPost> actual = service.getBlogPostsByAuthorAndAfterDate("any author", date); // assert assertTrue(actual.isEmpty()); }

Enter fullscreen mode Exit fullscreen mode

Using Custom Matcher

<span>@Test</span>
<span>public</span> <span>void</span> <span>checkIfBlogPostHasBeenSaved_withBlogPost_returnsTrue</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogPost</span> <span>post</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>5</span><span>));</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>ArgumentMatcher</span><span><</span><span>BlogPost</span><span>></span> <span>blogPostMatcher</span> <span>=</span> <span>passedBlogPost</span> <span>-></span>
<span>"Shane"</span><span>.</span><span>equals</span><span>(</span><span>passedBlogPost</span><span>.</span><span>getAuthor</span><span>());</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>checkIfBlogPostHasBeenSaved</span><span>(</span><span>Mockito</span><span>.</span><span>argThat</span><span>(</span><span>blogPostMatcher</span><span>)))</span>
<span>.</span><span>thenReturn</span><span>(</span><span>true</span><span>);</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>boolean</span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>checkIfBlogPostHasBeenSaved</span><span>(</span><span>post</span><span>);</span>
<span>// assert</span>
<span>assertTrue</span><span>(</span><span>actual</span><span>);</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>checkIfBlogPostHasBeenSaved_withBlogPost_returnsTrue</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogPost</span> <span>post</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for Humans"</span><span>,</span> <span>"Shane"</span><span>,</span> <span>new</span> <span>Date</span><span>(</span><span>5</span><span>));</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>

    <span>ArgumentMatcher</span><span><</span><span>BlogPost</span><span>></span> <span>blogPostMatcher</span> <span>=</span> <span>passedBlogPost</span> <span>-></span>
            <span>"Shane"</span><span>.</span><span>equals</span><span>(</span><span>passedBlogPost</span><span>.</span><span>getAuthor</span><span>());</span>

    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>checkIfBlogPostHasBeenSaved</span><span>(</span><span>Mockito</span><span>.</span><span>argThat</span><span>(</span><span>blogPostMatcher</span><span>)))</span>
            <span>.</span><span>thenReturn</span><span>(</span><span>true</span><span>);</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>boolean</span> <span>actual</span> <span>=</span> <span>service</span><span>.</span><span>checkIfBlogPostHasBeenSaved</span><span>(</span><span>post</span><span>);</span>

    <span>// assert</span>
    <span>assertTrue</span><span>(</span><span>actual</span><span>);</span>
<span>}</span>
@Test public void checkIfBlogPostHasBeenSaved_withBlogPost_returnsTrue() { // arrange BlogPost post = new BlogPost("Spring for Humans", "Shane", new Date(5)); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); ArgumentMatcher<BlogPost> blogPostMatcher = passedBlogPost -> "Shane".equals(passedBlogPost.getAuthor()); Mockito.when(blogRepository.checkIfBlogPostHasBeenSaved(Mockito.argThat(blogPostMatcher))) .thenReturn(true); BlogPostService service = new BlogPostService(blogRepository); // act boolean actual = service.checkIfBlogPostHasBeenSaved(post); // assert assertTrue(actual); }

Enter fullscreen mode Exit fullscreen mode

Verify a Stubbed Method Has Been Called

<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPost_verifiesThatRepositoryWasCalled</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>),</span>
<span>new</span> <span>BlogPost</span><span>(</span><span>"Mockito Cheatsheet"</span><span>));</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>()).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>service</span><span>.</span><span>getAllBlogPosts</span><span>();</span>
<span>// assert</span>
<span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>).</span><span>getAllBlogPosts</span><span>();</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getAllBlogPosts_withBlogPost_verifiesThatRepositoryWasCalled</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>List</span><span><</span><span>BlogPost</span><span>></span> <span>expected</span> <span>=</span> <span>Arrays</span><span>.</span><span>asList</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>),</span>
            <span>new</span> <span>BlogPost</span><span>(</span><span>"Mockito Cheatsheet"</span><span>));</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getAllBlogPosts</span><span>()).</span><span>thenReturn</span><span>(</span><span>expected</span><span>);</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>service</span><span>.</span><span>getAllBlogPosts</span><span>();</span>

    <span>// assert</span>
    <span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>).</span><span>getAllBlogPosts</span><span>();</span>
<span>}</span>
@Test public void getAllBlogPosts_withBlogPost_verifiesThatRepositoryWasCalled() { // arrange List<BlogPost> expected = Arrays.asList(new BlogPost("Spring for humans"), new BlogPost("Mockito Cheatsheet")); BlogRepository blogRepository = Mockito.mock(BlogRepository.class); Mockito.when(blogRepository.getAllBlogPosts()).thenReturn(expected); BlogPostService service = new BlogPostService(blogRepository); // act service.getAllBlogPosts(); // assert Mockito.verify(blogRepository).getAllBlogPosts(); }

Enter fullscreen mode Exit fullscreen mode

Verify a Stubbed Method Hasn’t Been Called

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withBlogPost_verifiesThatCorrectMethodWasCalled</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>BlogPost</span> <span>expoected</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>);</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>)).</span><span>thenReturn</span><span>(</span><span>Optional</span><span>.</span><span>of</span><span>(</span><span>expoected</span><span>));</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>// act</span>
<span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>);</span>
<span>// assert</span>
<span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>,</span> <span>Mockito</span><span>.</span><span>never</span><span>()).</span><span>getBlogPostById</span><span>(</span><span>100</span><span>);</span>
<span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>).</span><span>getBlogPostById</span><span>(</span><span>1</span><span>);</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withBlogPost_verifiesThatCorrectMethodWasCalled</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>BlogPost</span> <span>expoected</span> <span>=</span> <span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>);</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>)).</span><span>thenReturn</span><span>(</span><span>Optional</span><span>.</span><span>of</span><span>(</span><span>expoected</span><span>));</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>

    <span>// act</span>
    <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>1</span><span>);</span>

    <span>// assert</span>
    <span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>,</span> <span>Mockito</span><span>.</span><span>never</span><span>()).</span><span>getBlogPostById</span><span>(</span><span>100</span><span>);</span>
    <span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>).</span><span>getBlogPostById</span><span>(</span><span>1</span><span>);</span>
<span>}</span>
@Test public void getBlogPostById_withBlogPost_verifiesThatCorrectMethodWasCalled() { // arrange BlogRepository blogRepository = Mockito.mock(BlogRepository.class); BlogPost expoected = new BlogPost("Spring for humans"); Mockito.when(blogRepository.getBlogPostById(1)).thenReturn(Optional.of(expoected)); BlogPostService service = new BlogPostService(blogRepository); // act service.getBlogPostById(1); // assert Mockito.verify(blogRepository, Mockito.never()).getBlogPostById(100); Mockito.verify(blogRepository).getBlogPostById(1); }

Enter fullscreen mode Exit fullscreen mode

Capturing Arguments

<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withBlogPost_verifiesCorrectArgumentPassed</span><span>()</span> <span>{</span>
<span>// arrange</span>
<span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
<span>int</span> <span>expected</span> <span>=</span> <span>1</span><span>;</span>
<span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>expected</span><span>))</span>
<span>.</span><span>thenReturn</span><span>(</span><span>Optional</span><span>.</span><span>of</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>)));</span>
<span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
<span>ArgumentCaptor</span><span><</span><span>Integer</span><span>></span> <span>captor</span> <span>=</span> <span>ArgumentCaptor</span><span>.</span><span>forClass</span><span>(</span><span>Integer</span><span>.</span><span>class</span><span>);</span>
<span>// act</span>
<span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>expected</span><span>);</span>
<span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>).</span><span>getBlogPostById</span><span>(</span><span>captor</span><span>.</span><span>capture</span><span>());</span>
<span>int</span> <span>actual</span> <span>=</span> <span>captor</span><span>.</span><span>getValue</span><span>();</span>
<span>// assert</span>
<span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
<span>@Test</span>
<span>public</span> <span>void</span> <span>getBlogPostById_withBlogPost_verifiesCorrectArgumentPassed</span><span>()</span> <span>{</span>
    <span>// arrange</span>
    <span>BlogRepository</span> <span>blogRepository</span> <span>=</span> <span>Mockito</span><span>.</span><span>mock</span><span>(</span><span>BlogRepository</span><span>.</span><span>class</span><span>);</span>
    <span>int</span> <span>expected</span> <span>=</span> <span>1</span><span>;</span>
    <span>Mockito</span><span>.</span><span>when</span><span>(</span><span>blogRepository</span><span>.</span><span>getBlogPostById</span><span>(</span><span>expected</span><span>))</span>
            <span>.</span><span>thenReturn</span><span>(</span><span>Optional</span><span>.</span><span>of</span><span>(</span><span>new</span> <span>BlogPost</span><span>(</span><span>"Spring for humans"</span><span>)));</span>
    <span>BlogPostService</span> <span>service</span> <span>=</span> <span>new</span> <span>BlogPostService</span><span>(</span><span>blogRepository</span><span>);</span>
    <span>ArgumentCaptor</span><span><</span><span>Integer</span><span>></span> <span>captor</span> <span>=</span> <span>ArgumentCaptor</span><span>.</span><span>forClass</span><span>(</span><span>Integer</span><span>.</span><span>class</span><span>);</span>

    <span>// act</span>
    <span>service</span><span>.</span><span>getBlogPostById</span><span>(</span><span>expected</span><span>);</span>
    <span>Mockito</span><span>.</span><span>verify</span><span>(</span><span>blogRepository</span><span>).</span><span>getBlogPostById</span><span>(</span><span>captor</span><span>.</span><span>capture</span><span>());</span>
    <span>int</span> <span>actual</span> <span>=</span> <span>captor</span><span>.</span><span>getValue</span><span>();</span>

    <span>// assert</span>
    <span>assertEquals</span><span>(</span><span>expected</span><span>,</span> <span>actual</span><span>);</span>
<span>}</span>
@Test public void getBlogPostById_withBlogPost_verifiesCorrectArgumentPassed() { // arrange BlogRepository blogRepository = Mockito.mock(BlogRepository.class); int expected = 1; Mockito.when(blogRepository.getBlogPostById(expected)) .thenReturn(Optional.of(new BlogPost("Spring for humans"))); BlogPostService service = new BlogPostService(blogRepository); ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class); // act service.getBlogPostById(expected); Mockito.verify(blogRepository).getBlogPostById(captor.capture()); int actual = captor.getValue(); // assert assertEquals(expected, actual); }

Enter fullscreen mode Exit fullscreen mode

Conclusion

Hopefully the snippets laid out here will help you quickly set up your mockito tests. The full examples can be seen here on GitHub.

Happy Coding!

原文链接:Mockito Cheatsheet

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
Work hard in silence, let success make the noise.
在沉默中努力,让成功自己发声
评论 抢沙发

请登录后发表评论

    暂无评论内容