为什么@Spy Abc abc无法获取已经存在的实例?

时间:2019-01-22 10:24:50

标签: java junit mockito

我有一个junit测试用例,其中以以下方式使用了Spy,并且  Junit在以下方面失败。

<h2>{this.state.list_title}</h2>
{this.state.list.map(item => { ... }}

但是可以成功运行。

@Spy
private Abc abc;

有人可以解释我为什么吗?另外,在此声明中  @Spy Abc abc = new Abc();  是否创建了新实例,还是使用现有实例?  即@Spy Abc abc = new Abc();

1 个答案:

答案 0 :(得分:2)

使用@Spy批注时,Mockito会将现有实例包装在间谍对象中。 @Spy注释的工作方式类似于以下代码:

Abc spyAbc = Mockito.spy(new Abc());

这意味着,这两个表达式将产生相同的结果:

@Spy Abc abc = new Abc();
Abc abc = Mockito.spy(new Abc());

以下语句仅在存在默认构造函数时才起作用:

@Spy Abc abc;

使用间谍,间谍对象的行为与原始实现相同(尽管您可以使用

定义自定义测试行为
Mockito.doReturn(1).when(abc).myMethod();

相反,使用模拟对象(Mockito.mock(Abc.class))不会提供与原始实现相同的行为,因为它不是类的真实实例。

当您想监视四季豆时,您必须采取以下可能的方法:

像这样使用@SpyBean(请参阅:https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/mock/mockito/SpyBean.html

@SpyBean
private Abc abc;

或结合使用@Autowired@Spy

@Spy
@Autowired
private Abc abc;

两种方法都可以使用。请注意when(abc.method()).thenReturn(1);doReturn(1).when(abc).method();的区别。只有在第一种情况下,method()才真正被调用(并且只有返回时才被修改)。对于第二个示例,将不会调用该方法。要了解该方法是否有副作用,这种差异很重要。