【问题标题】:Spring (@SpyBean) vs Mockito(@Spy)Spring(@SpyBean)与 Mockito(@Spy)
【发布时间】:2019-07-09 14:41:52
【问题描述】:

org.springframework.boot.test.mock.mockito.SpyBean中的@SpyBeanorg.mockito.Spy中的@Spy有什么区别?

使用@SpyBean 而不是@Spy 会使我的tests 失败。

【问题讨论】:

    标签: java spring unit-testing kotlin spy


    【解决方案1】:

    @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将添加一个新的。"
    【解决方案2】:

    我在测试过程中注意到的一点是,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 并且两个测试都通过了。

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2023-03-20
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多