2021-04-28 16:49:39 +02:00
Objects annotated with Mockito annotations ``++@Mock++``, ``++@Spy++``, ``++@Captor++``, or ``++@InjectMocks++`` need to be initialized explicitly.
There are several ways to do this:
* Call ``++MockitoAnnotations.openMocks(this)++`` or ``++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();++``
Test using uninitialized mocks will fail.
Note that this only applies to annotated Mockito objects. It is not necessary to initialize objects instantiated via ``++Mockito.mock()++`` or ``++Mockito.spy()++``.
This rule raises an issue when a test class uses uninitialized mocks.
2021-04-28 18:08:03 +02:00
2021-04-28 16:49:39 +02:00
== Noncompliant Code Example
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
public class FooTest { // Noncompliant: Mockito initialization missing
@Mock private Bar bar;
@Spy private Baz baz;
@InjectMocks private Foo fooUnderTest;
@Test
void someTest() {
// test something ...
}
@Nested
public class Nested {
@Mock
private Bar bar;
}
----
2021-04-28 18:08:03 +02:00
2021-04-28 16:49:39 +02:00
== Compliant Solution
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock private Bar bar;
// ...
}
----
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
@ExtendWith(MockitoExtension.class)
public class FooTest {
@Mock private Bar bar;
// ...
}
----
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
public class FooTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock private Bar bar;
// ...
}
----
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
public class FooTest {
@Mock private Bar bar;
// ...
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
// ...
}
----
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
public class FooTest {
@Mock private Bar bar;
// ...
@Before
void setUp() {
MockitoAnnotations.initMocks(this);
}
// ...
}
----
2022-02-04 17:28:24 +01:00
[source,java]
2021-04-28 16:49:39 +02:00
----
@ExtendWith(MockitoExtension.class)
public class FooTest {
@Nested
public class Nested {
@Mock
private Bar bar;
}
}
----
2021-04-28 18:08:03 +02:00
2021-04-28 16:49:39 +02:00
== See
* https://site.mockito.org/javadoc/current/org/mockito/MockitoAnnotations.html[Mockito documentation - MockitoAnnotations]
* https://site.mockito.org/javadoc/current/org/mockito/junit/MockitoRule.html[Mockito documentation - MockitoRule ]
2021-04-28 18:08:03 +02:00
2021-06-02 20:44:38 +02:00
2021-06-03 09:05:38 +02:00
ifdef::env-github,rspecator-view[]
2021-09-20 15:38:42 +02:00
'''
== Implementation Specification
(visible only on this page)
include::message.adoc[]
include::highlighting.adoc[]
2021-06-08 15:52:13 +02:00
'''
2021-06-02 20:44:38 +02:00
== Comments And Links
(visible only on this page)
include::comments-and-links.adoc[]
2021-06-03 09:05:38 +02:00
endif::env-github,rspecator-view[]