我有一个单独的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() {}
}
现在我想为Singleton创建一个JUnit-Test:
@Mock
MyPrototype prototype;
@InjectMocks
MySingleton sut;
@Test
public void testPrototype() {
sut.doStuff();
verify(prototype, times(1)).invoke();
}
但可以理解的是,没有正确设置Singleton的Provider
。
有没有办法做到这一点?我想避免创建一个Singleton Factory bean来创建Prototype实例。
或者,对于Singleton使用@Lookup
- 工厂方法可能会优雅吗?我还没有考虑到这一点。
答案 0 :(得分:4)
我会将Provider
存根并使其每次使用在每个测试之前调用的prototypeMock
方法返回@Before
:
@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();
}
答案 1 :(得分:0)
@Mock
MyPrototype prototype;
@Spy
Provider<MyPrototype> prototypeProvider = new Provider<MyPrototype>() {
public MyPrototype get() {return prototype;}
};
@InjectMocks
MySingleton sut;