Mockito @Spy和@Mock之间的区别(answer = Answers.CALLS_REAL_METHODS)

And*_*fii 18 mockito

mockito中这两个声明有什么区别?

@Mock(answer = Answers.CALLS_REAL_METHODS)
ArrayList<String> mock;

@Spy
ArrayList<String> spy;
Run Code Online (Sandbox Code Playgroud)

Jef*_*ica 11

前一个CALLS_REAL_METHODS样式创建一个未初始化的对象; 没有运行构造函数,也没有设置任何字段.通常,这种语法是不安全的,因为实际实现将与可能构成无效或不可能状态的未初始化字段交互.

后者@Spy样式允许您调用您选择的构造函数,或者如果字段未初始化,Mockito将尝试调用无参数构造函数.然后将这些字段复制到生成的间谍中(扩展了间谍类型),从而实现更安全,更真实的交互.


必要提醒:不要在玩具示例之外实际模拟Java集合,并且doReturn在覆盖间谍和CALLS_REAL_METHOD模拟时不要忘记使用语法,否则您将在调用中调用真实方法when.