我使用InjectMocks
和Spy
注释来注入原型bean。
然而,注入bean的行为类似于单例bean。有没有办法在Mockito注入原型范围的bean?
我正在使用SpringJUnit4ClassRunner
运行JUnit并使用MockitoAnnotations.initMocks(this)
初始化。
答案 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
}
}