gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:42:09 29 4
gpt4 key购买 nike

我有 junit 测试用例,我按以下方式使用了 Spy ,并且 Junit 在以下情况下失败。

@Spy
private Abc abc;

但是运行成功。

@Spy  Abc abc =  new Abc(); 

有人可以解释一下为什么吗?另外,在这份声明中 @Spy Abc abc = new Abc(); 是否创建新实例或使用现有实例 这就是自动连线

最佳答案

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

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

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

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

以下语句仅在有默认构造函数时才有效:

@Spy Abc abc;

使用 spy , spy 对象的行为与您的原始实现相同(尽管您可以使用例如定义自定义测试行为

Mockito.doReturn(1).when(abc).myMethod();

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

当你想监视 Spring Bean 时,你必须采用可能的方法:

使用@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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com