我有一个单例 Spring bean 可以创建原型 bean;这些是从javax.inject.Provider
字段中检索的:
@Component
public class MySingleton {
@Autowired
private javax.inject.Provider<MyPrototype> prototypeFactory;
public void doStuff() {
MyPrototype bean = prototypeFactory.get();
bean.invoke();
}
}
@Component
@Scope("prototype")
public class MyPrototype {
public void invoke() {}
}
现在我想为单例创建一个 JUnit-Test:
@Mock
MyPrototype prototype;
@InjectMocks
MySingleton sut;
@Test
public void testPrototype() {
sut.doStuff();
verify(prototype, times(1)).invoke();
}
但可以理解的是,这并不能正确设置单例Provider
。
有什么办法可以做到这一点吗?我想避免创建创建原型实例的单例工厂 bean。
或者,对单例使用@Lookup
工厂方法是否可能优雅?我还没有研究过。
我会存
根该Provider
,并使其每次使用每次测试之前调用的@Before
方法返回prototypeMock
:
@Mock
private javax.inject.Provider<MyPrototype> prototypeFactoryStub;
@Mock
MyPrototype prototypeMock;
@InjectMocks
MySingleton sut;
@Before
public void init(){
MockitoAnnotations.initMocks(this); // optional
when(prototypeFactoryStub.get()).thenReturn(prototypeMock);
}
@Test
public void testPrototype() {
sut.doStuff();
verify(prototypeMock, times(1)).invoke();
}
@Mock
MyPrototype prototype;
@Spy
Provider<MyPrototype> prototypeProvider = new Provider<MyPrototype>() {
public MyPrototype get() {return prototype;}
};
@InjectMocks
MySingleton sut;