@SpyBean
的{{1}}和org.springframework.boot.test.mock.mockito.SpyBean
的{{1}}有什么区别?
使用@Spy
而不是org.mockito.Spy
会使我的tests失败。
答案 0 :(得分:2)
firstCharInName.trimmingCharacters(in: .whitespaces)
doc说:
带有@Spy注释的字段可以在处显式初始化 声明点。或者,如果您不提供实例 Mockito将尝试查找零参数构造函数(甚至是私有的),并且 为您创建一个实例。
@Spy
doc说:
可用于将Mockito间谍应用于Spring的注释 ApplicationContext。
在相同类型的上下文中,所有bean都将使用 间谍。如果没有定义现有的bean,则会添加一个新的bean。
所以主要区别是@SpyBean
是特定于Spring Boot的注释,而@SpyBean
是Mockito本身的一部分。 @Spy
和@SpyBean
基本上可以做到这一点,但是@Spy
可以解决特定于Spring的依赖项,例如@SpyBean
,@Autowired
只能使用空构造函数创建对象。
答案 1 :(得分:0)
我在测试过程中注意到的一点是,SpyBean 会导致某些值在测试之间被转移,而 Spy 总是从一个干净的石板开始。就我而言,我在最初具有自动装配组件的类上设置了 @SpyBean。但是在我重构类以删除它们之后,我没有更改测试类,并且出现了意外失败。
Class1 {
boolean boo;
myMethodA() {
if (something) {
boo=true;
}
}
myMethodB() {
if (boo) {
doThis();
} else {
doThat();
}
}
}
Test1 和 Test2 都使用了@SpyBean Class1。 Test1 和 Test2 都单独成功运行,但作为套件运行时,如果 Test2 在 Test1 之后运行,则会失败。
Test1 将 Class1 中的布尔值设置为 true,Test2 运行时仍然为 true。这导致 Test2 失败,因为它期望布尔值为 false。更改为 @间谍班1 导致布尔值被重置为 false 并且两个测试都通过了。