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

时间:2015-11-04 07:46:46

标签: mockito

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

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

    @Spy
    ArrayList<String> spy;

1 个答案:

答案 0 :(得分:7)

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

后者@Spy风格允许您调用您选择的构造函数,或者Mockito将try to call a no-arg constructor if the field is uninitialized。然后将这些字段复制到生成的间谍中(扩展了间谍类型),从而实现更安全,更真实的交互。

必备提醒:实际上不要在玩具示例之外模拟Java集合,并且在覆盖间谍和CALLS_REAL_METHOD模拟时不要忘记使用doReturn语法,否则你将在{{{{}}中调用真实方法1}}来电。