Using Mockito with JUnit 5
Since version 2.16.3 Mockito has official support for Junit5. Using Mockito with JUnit now is even easier than before. Previously I kept forgetting what rule I was supposed to use for injecting the mocks, and how I set the strictness again? Plus the extra field in each test class!
Mockito with JUnit 5 example
The newly introduced extension is not part of the mockito-core package. In order to use it, you will have to add a separate dependency:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
The extension will initialize all the fields annotated with @Mock. If you want to set the strictness of the stubs, use the MockitoSetting annotations. In the sample code, I set the strictness to STRTICT_STUBS although that is already the default.
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.STRICT_STUBS)
class ChatEngineTest {
@Mock
private MessageSender messageSender;
@Test
public void shouldUseMessageSenderToSendMessage() {
ChatEngine chatEngine = new ChatEngine(messageSender);
String messageToSend = "Hello!";
chatEngine.say(messageToSend);
when(messageSender.send(messageToSend)).thenReturn(OK);
assertThat(messageSender.send(messageToSend)).isEqualTo(OK);
}
}
How does the extension work?
I previously spoke about the JUnit 5 extension model, and MockitoExtension is a great example of putting that into practice. It uses three extension points:
- TestInstancePostProcessor: to set the test instance.
- BeforeEachCallback: to create the Mockito session and initialize all the mocks.
- AfterEachCallback: to remove the previously created session.
Nice and easy.