如何在Mockito中注入原型bean

Raj*_*ure 5 spring mockito

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

但是,注入bean的行为类似于单例bean。有什么方法可以在Mockito中注入原型作用域的bean?

我正在运行JUnit SpringJUnit4ClassRunner并使用进行了模拟MockitoAnnotations.initMocks(this)

小智 4

这是因为 Mockito 在编译时创建注入的对象。如果您想要类似原型的行为,则需要改用答案。

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

ctx.getBean("Foo");
Run Code Online (Sandbox Code Playgroud)

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

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

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

Foo foo = new Foo();
decorateFoo(foo);
when(ctx.getBean("Foo")).thenReturn(foo);
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我没有从上下文中得到启发。我使用了 Autowire 注释。 (3认同)