Mockito Programming Model: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 77: Line 77:
</syntaxhighlight>
</syntaxhighlight>
The <code>when()</code> configures the method(s) to stub, or the '''trigger action'''. The <code>then*()</code> methods specify what to do when the trigger is activated. The options are:
The <code>when()</code> configures the method(s) to stub, or the '''trigger action'''. The <code>then*()</code> methods specify what to do when the trigger is activated. The options are:
* <code>thenReturn(...)</code>: returns the given value. It has several variants:
==Stub Responses==
===<tt>thenReturn()</tt>===
<code>thenReturn(...)</code>: returns the given value. It has several variants:
** <code>thenReturn(value)</code>: return the same value every time.
** <code>thenReturn(value)</code>: return the same value every time.
** <code>thenReturn(value1, value2, value3, ...)</code>: return the first value on first invocation, second value on the second invocation, etc. The equivalent is: <code>thenReturn(value1).thenReturn(value2).thenReturn(value3). ...</code>
** <code>thenReturn(value1, value2, value3, ...)</code>: return the first value on first invocation, second value on the second invocation, etc. The equivalent is: <code>thenReturn(value1).thenReturn(value2).thenReturn(value3). ...</code>
 
===<tt>thenThrow()</tt>===
* <code>thenThrow()</code>: throws the given exception.
<code>thenThrow()</code>: throws the given exception.
* <code>thenAnswer(Answer answer)</code>: execute custom logic and compute a value to return. This turns the [[Software Testing Concepts#Stub|stub]] object into a [[Software Testing Concepts#Fake|fake]].
===<tt>thenAnswer()</tt>===
* <code>thenCallRealMethod()</code>. Delegates the invocation to the real external dependency.
<code>thenAnswer(Answer answer)</code>: execute custom logic and compute a value to return. This turns the [[Software Testing Concepts#Stub|stub]] object into a [[Software Testing Concepts#Fake|fake]].
 
===<tt>thenCallRealMethod()</tt>===
<code>thenCallRealMethod()</code>. Delegates the invocation to the real external dependency.
==<span id='Argument_Matcher'></span>Argument Matchers==
==<span id='Argument_Matcher'></span>Argument Matchers==
===<tt>isA()</tt>===
===<tt>isA()</tt>===

Revision as of 16:58, 16 July 2021

Internal

Overview

API

import static org.mockito.Mockito.mock;
import com.example.ExternalDependency;

public class SomeClassTest {

  private ExternalDependency mockExternalDependency;

  @Before
  public void setUp() {
    mockExternalDependency = mock(ExternalDependency.class);
  }

  @Test
  public void someTest() throws Exception {
    ...
  }
}

Annotations

import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import com.example.ExternalDependency;

public class SomeClassTest {

  private AutoCloseable mocks;

  @Mock
  private ExternalDependency mockExternalDependency;

  @Before
  public void openMocks() {
    mocks = MockitoAnnotations.openMocks(this);
  }

  @After
  public void releaseMocks() throws Exception {
    mocks.close();
  }

  @Test
  public void someTest() throws Exception {
    ...
  }
}

Implementing Stub Functionality

A stub returns synthetic responses or throws exceptions when its methods are invoked. Mockito supports stubbing and by returning a given value when a specific method of the managed test double is called. Mockito implements the stub functionality with Mockito.when(<method>).thenReturn(...) pattern:

public class ExternalDependency {
  public String someMethod() {
    ...
  }
}
public class SomeClassTest {

  @Mock
  private ExternalDependency mockExternalDependency;

  @Test
  public void someTest() throws Exception {
    Mockito.when(mockExternalDependency.someMethod()).thenReturn("some synthetic result");
    ...
  }
}

The when() configures the method(s) to stub, or the trigger action. The then*() methods specify what to do when the trigger is activated. The options are:

Stub Responses

thenReturn()

thenReturn(...): returns the given value. It has several variants:

    • thenReturn(value): return the same value every time.
    • thenReturn(value1, value2, value3, ...): return the first value on first invocation, second value on the second invocation, etc. The equivalent is: thenReturn(value1).thenReturn(value2).thenReturn(value3). ...

thenThrow()

thenThrow(): throws the given exception.

thenAnswer()

thenAnswer(Answer answer): execute custom logic and compute a value to return. This turns the stub object into a fake.

thenCallRealMethod()

thenCallRealMethod(). Delegates the invocation to the real external dependency.

Argument Matchers

isA()

public class ExternalDependency {
  public String someMethodWithArg(String s) {
    ...
  }
}
import static org.mockito.ArgumentMatchers.isA;
  ...
  Mockito.when(mockExternalDependency.someMethodWithArg(isA(String.class))).thenReturn(...);
}

Why is isA() needed, why not provide the class, directly?

anyString()