我有一个junit测试用例,其中以以下方式使用了Spy,并且
Junit在以下方面失败。
@Spy
private Abc abc;
但是可以成功运行。
@Spy Abc abc = new Abc();
有人可以解释我为什么吗?另外,在此声明中
@Spy Abc abc = new Abc();
是否创建了新实例,还是使用现有实例?
即
Autowired
。 最佳答案
使用@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()
才真正被调用(并且只有返回时才被修改)。对于第二个示例,将不会调用该方法。要了解该方法是否有副作用,很重要。关于java - 为什么@Spy Abc abc无法获取已经存在的实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54306136/