我有一个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/

10-14 12:20