【发布时间】:2019-07-09 14:41:52
【问题描述】:
org.springframework.boot.test.mock.mockito.SpyBean中的@SpyBean和org.mockito.Spy中的@Spy有什么区别?
使用@SpyBean 而不是@Spy 会使我的tests 失败。
【问题讨论】:
标签: java spring unit-testing kotlin spy
org.springframework.boot.test.mock.mockito.SpyBean中的@SpyBean和org.mockito.Spy中的@Spy有什么区别?
使用@SpyBean 而不是@Spy 会使我的tests 失败。
【问题讨论】:
标签: java spring unit-testing kotlin spy
@Spydoc 说:
使用@Spy 注释的字段可以显式初始化为 申报点。或者,如果您不提供实例 Mockito 将尝试找到零参数构造函数(甚至是私有的)和 为您创建一个实例。
@SpyBeandoc 说:
可用于将 Mockito 间谍应用到 Spring 的注解 应用程序上下文。
同一类型上下文中的所有 bean 都将使用 间谍。如果没有定义现有的 bean,则会添加一个新的。
所以主要区别在于 @SpyBean 是 Spring Boot 特定的注释,但 @Spy 是 Mockito 本身的一部分。 @SpyBean 和 @Spy 基本相同,但 @SpyBean 可以解决 Spring 特定的依赖关系,例如@Autowired, @Spy 只能用空的构造函数创建对象。
【讨论】:
@SpyBean 将从 Spring 容器中已经存在的实例中加载 bean,@Spy 将创建一个全新的对象,无论是否已经存在于 Spring 容器中?
@Spy 像你说的那样工作,但在@SpyBean 的情况下,文档说:“相同类型的上下文中的所有bean都将被间谍包装。如果没有定义现有的bean将添加一个新的。"
我在测试过程中注意到的一点是,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 失败,因为它期望布尔值是错误的。更改为 @间谍类1 导致布尔值被重置为 false 并且两个测试都通过了。
【讨论】: