@SpyBean与org.springframework.boot.test.mock.mockito.SpyBean和@Spy与org.mockito.Spy有什么区别?
使用@SpyBean而不是@Spy使我的测试失败。
发布于 2019-02-18 08:17:07
@Spy 文档说:
带有@Spy注释的字段可以在声明点显式初始化。或者,如果不提供实例,Mockito将尝试找到零参数构造函数(甚至是私有构造函数),并为您创建一个实例。
@SpyBean 文档说:
注释,可用于将Mockito间谍应用于Spring ApplicationContext。 同一类型上下文中的所有bean都将与间谍一起包装。如果未定义现有bean,则将添加一个新bean。
因此,主要的区别是@SpyBean是一个Spring特定的注释,但是@Spy是Mockito本身的一部分。@SpyBean和@Spy基本上都是这样做的,但是@SpyBean可以解决特定于Spring的依赖关系,例如@Autowired,@Spy只能使用空构造函数创建对象。
发布于 2021-03-03 08:21:56
我在测试期间注意到的是,SpyBean可能导致某些值在测试之间结转,而Spy总是从一个干净的板子开始。在我的例子中,我将@SpyBean设置在一个类上,该类最初具有自动设置的组件。但是,在重构了类以删除它们之后,我没有更改测试类,并且发生了意外的失败。
Class1 {
boolean boo;
myMethodA() {
if (something) {
boo=true;
}
}
myMethodB() {
if (boo) {
doThis();
} else {
doThat();
}
}
}Test1和Test2都使用@SpyBean Class1。Test1和Test2都成功地独立运行,但是当作为一个套件运行时,如果它运行在Test1之后,Test2就会失败。
Test1将Class1中的布尔值设置为true,但Test2运行时仍为真。这导致Test2失败,因为它期望布尔值为false。更改为@Spy Class1会导致布尔值重置为false,并且两个测试都会通过。
https://stackoverflow.com/questions/54709589
复制相似问题