我有一个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();
。
答案 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()
才真正被调用(并且只有返回时才被修改)。对于第二个示例,将不会调用该方法。要了解该方法是否有副作用,这种差异很重要。