Annotated Mockito objects (@Mock
, @Spy
, @Captor
, @InjectMocks
) need to be initialized explicitly.
There are several ways to do this:
- Call
MockitoAnnotations.initMocks(this)
in a setup method - Annotate test class with
@RunWith(MockitoJUnitRunner.class)
(JUnit 4) - Annotate test class with
@ExtendWith(MockitoExtension.class)
(JUnit 5 Jupiter) - Use
@Rule public MockitoRule rule = MockitoJUnit.rule();
Leaving the objects uninitialized is a bug.
Snippet of Noncompliant Code
public class FooTest { // Non-Compliant: Mockito initialization missing
@Mock private Bar bar;
@Spy private Baz baz;
@InjectMocks private Foo fooUnderTest;
@Test
void someTest() {
// test something ...
}
}
Snippet of Compliant Code
@RunWith(MockitoJUnitRunner.class)
public class FooTest { // Compliant -- runs with MockitoJUnitRunner
@Mock private Bar bar;
// ...
}
@ExtendWith(MockitoExtension.class)
public class FooTest { // Compliant -- runs with MockitoExtension
@Mock private Bar bar;
// ...
}
public class FooTest { // Compliant -- uses MockitoRule
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock private Bar bar;
// ...
}
public class FooTest { // Compliant -- calls initMocks
@Mock private Bar bar;
// ...
@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
}
// ...
}
Exceptions
This only applies to annotated Mockito objects. It is not necessary to initialize objects instantiated via Mockito.mock()
or Mockito.spy()
.
External references and/or language specifications
-
Mockito docs:
https://site.mockito.org/javadoc/current/org/mockito/MockitoAnnotations.html
https://site.mockito.org/javadoc/current/org/mockito/junit/MockitoRule.html -
Discussion: https://stackoverflow.com/questions/15494926/initialising-mock-objects-mockito
-
type: Bug
-
tags: java, mockito, pitfall