我已经浏览了一些博客,以了解Mockito注释如何工作的基础知识.
但是,我怀疑何时可以手动实例化用@InjectMocks注释的字段,即
@InjectMocks
A a = new A();
什么时候依靠MockitoAnnotations.initMocks()功能来做同样的事情:
@InjectMocks
A a;
这取决于我们用来运行测试用例的JunitTestRunner还是依赖于Mockito框架版本?
解决方法:
这取决于你是否正在使用(声明)跑步者.
如果你使用跑步者,你不需要自己调用MockitoAnnotations.initMocks() – 跑步者会为你调用它.
通常我们会选择跑步者.但是当你想要使用其他跑步者时(比如Spring),你可以自己调用.initMocks().
为了清楚起见,MockitoAnnotations.initMocks(this)将:
>实例化使用@InjectMocks注释的字段
>创建使用@Mock注释的每个字段的模拟版本
>在@InjectMocks变量的字段中注入@Mocks(或调用其构造函数或使用其setter – 它取决于您使用的依赖注入类型)
Mockito运行器,initMocks和规则代码示例
下面的三个代码示例应该是等效的.
有跑者:
第一个片段使用了转轮,无需调用initMocks().
@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!"));
}
}
没有跑步者手动调用.initMocks():
另一个不使用runner,因此需要setUp()方法调用我们的initMocks()朋友.
// 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!"));
}
}
没有跑步者或手动呼叫,使用@Rule:
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!"));
}
}
来源:http://www.icode9.com/content-1-210351.html