如何在Mockito中注入原型bean

时间:2017-05-25 14:18:52

标签: spring mockito

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

然而,注入bean的行为类似于单例bean。有没有办法在Mockito注入原型范围的bean?

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

1 个答案:

答案 0 :(得分:3)

那是因为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
    }
}