It depends if you are using (declaring) the runner or not.
If you use the runner, you don't need to call MockitoAnnotations.initMocks()
yourself - the runner calls it for you.
Usually we go for the runner. When you want to use other runners, though (like Spring's), you can call .initMocks()
yourself.
Just to be clear, the MockitoAnnotations.initMocks(this)
will:
- Instantiate the field annotated with
@InjectMocks
- Create a mock version of every field annotated with
@Mock
- Inject the
@Mock
s in the @InjectMocks
variable's fields (or call its constructors or use its setters - it depends on what kind of Dependency Injection you use)
Mockito runner, initMocks and rule code samples
The three code samples below should be equivalent.
With runner:
This first snippet uses the runner, making the call to initMocks()
unnecessary.
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock private MyDependency myDependency;
@InjectMocks private MyClass myClass;
@Test
public void myClass_should_get_stuff_from_dependency() {
when(myDependency.getStuff()).thenReturn("stuff!");
assertThat(myClass.getDependencyStuff(), is("stuff!"));
}
}
Without runner + with manual call to .initMocks()
:
This other does not use the runner, thus the need for the setUp()
method calling our initMocks()
friend.
// notice there is no runner
public class MyClassTest {
@Mock private MyDependency myDependency;
@InjectMocks private MyClass myClass;
// but now you have to call initMocks() yourself
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void myClass_should_get_stuff_from_dependency() {
when(myDependency.getStuff()).thenReturn("stuff!");
assertThat(myClass.getDependencyStuff(), is("stuff!"));
}
}
Without runner or manual call, using @Rule
:
Finally, as pointed out in the comments (thanks @StefanBirkner), since version 1.10.17, there is also the possibility of using a JUnit @Rule
called MockitoRule
:
public class MyClassTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock private MyDependency myDependency;
@InjectMocks private MyClass myClass;
@Test
public void myClass_should_get_stuff_from_dependency() {
when(myDependency.getStuff()).thenReturn("stuff!");
assertThat(myClass.getDependencyStuff(), is("stuff!"));
}
}