javaunit-testingjunitmockitojunit5

How to use Mockito with JUnit 5?


How can I use injection with Mockito and JUnit 5?

In JUnit 4, I can just use the @RunWith(MockitoJUnitRunner.class) annotation.
In JUnit 5, there is no @RunWith Annotation.


Solution

  • There are different ways to use Mockito - I'll go through them one by one.

    Manually

    Creating mocks manually with Mockito::mock works regardless of the JUnit version (or test framework for that matter).

    Annotation Based

    Using the @Mock-annotation and the corresponding call to MockitoAnnotations::initMocks to create mocks works regardless of the JUnit version (or test framework for that matter but Java 9 could interfere here, depending on whether the test code ends up in a module or not).

    Mockito Extension

    JUnit 5 has a powerful extension model and Mockito recently published one under the group / artifact ID org.mockito : mockito-junit-jupiter.

    You can apply the extension by adding @ExtendWith(MockitoExtension.class) to the test class and annotating mocked fields with @Mock. From MockitoExtension's JavaDoc:

    @ExtendWith(MockitoExtension.class)
    public class ExampleTest {
    
        @Mock
        private List list;
    
        @Test
        public void shouldDoSomething() {
            list.add(100);
        }
    
    }
    

    The MockitoExtension documentation describes other ways to instantiate mocks, for example with constructor injection (if you rpefer final fields in test classes).

    No Rules, No Runners

    JUnit 4 rules and runners don't work in JUnit 5, so the MockitoRule and the Mockito runner can not be used.