【问题标题】:How to Inject Prototype bean in Mockito如何在 Mockito 中注入 Prototype bean
【发布时间】:2017-05-25 14:18:51
【问题描述】:

我正在使用InjectMocksSpy 注释来注入原型bean。

但是,注入 bean 的行为类似于单例 bean。有没有办法在 Mockito 中注入原型作用域 bean?

我正在使用 SpringJUnit4ClassRunner 运行 JUnit,并使用 MockitoAnnotations.initMocks(this) 进行初始化模拟。

【问题讨论】:

  • 如果你使用@Spy,如果有多个实例,你会监视你的原型bean的哪个实例?您正在声明一个变量,但希望它充当多个变量,我说对了吗?
  • 我正在使用 Spy,因为依赖项是私有变量。是的,我声明了 1 个变量,并且我希望 Mockito 每次被引用时都会注入新的 bean 实例。
  • 据我所知,没有办法做到这一点,当然是手动的。我怀疑这是在典型的模拟设置中的真正需求,您想在间谍上调用do...when...verify,如果@Spy 变量只是某种模板而不是实际的间谍,这是不可能的.

标签: spring mockito


【解决方案1】:

那是因为 Mockito 在编译时创建了您的注入对象。 如果你想要一个类似原型的行为,你需要切换到使用答案。

例如,假设您的 Spring 应用程序有一个名为 Foo 的原型 bean,并且您的代码多次执行以下操作:

ctx.getBean("Foo");

由于 Foo 是一个原型,所以每次调用 getBean() 时,Spring 都会返回一个新的 Foo 实例。

现在,在您的 Mockito 测试中,您模拟了 ctx 以欺骗 getBean() 并返回您自己预配置的 Foo 实例。

如果你像下面这样设置你的测试,无论你的代码调用多少次 ctx.getBean(),都会返回相同的 Foo 实例:

Foo foo = new Foo();
decorateFoo(foo);
when(ctx.getBean("Foo")).thenReturn(foo);

这是您在测试中实现类似原型的行为的方法:

when(ctx.getBean("Foo")).then(new FooAnswer());

private class FooAnswer implements Answer<Foo> {
    @Override
    public Foo answer(InvocationOnMock invocationOnMock) throws Throwable {
                return new Foo(); // and configure as needed
    }
}

【讨论】:

  • 我没有从上下文中获取 bean。我使用了 Autowire 注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2013-06-22
相关资源
最近更新 更多