春天(@SpyBean)vs Mockito(@Spy)

时间:2019-02-15 12:39:17

标签: java spring unit-testing kotlin spy

@SpyBean的{​​{1}}和org.springframework.boot.test.mock.mockito.SpyBean的{​​{1}}有什么区别?

使用@Spy而不是org.mockito.Spy会使我的tests失败。

2 个答案:

答案 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 并且两个测试都通过了。