Mockito:如何模拟javax.inject.Provider创建的原型bean?

dan*_*niu 5 java junit spring unit-testing mockito

我有一个单例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() {}
}
Run Code Online (Sandbox Code Playgroud)

现在,我想为Singleton创建一个JUnit-Test:

@Mock 
MyPrototype prototype;
@InjectMocks 
MySingleton sut;
@Test
public void testPrototype() {
    sut.doStuff();
    verify(prototype, times(1)).invoke();
}
Run Code Online (Sandbox Code Playgroud)

但这可以理解为无法正确设置Singleton's Provider

有什么办法吗?我想避免创建创建Prototype实例的Singleton Factory bean。

或者,使用@LookupSingleton 的-factory方法可能很优雅吗?我还没有研究过。

Mac*_*ski 6

我会对它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();
}
Run Code Online (Sandbox Code Playgroud)

如果您需要进一步阅读,我已经写了一篇有关Mockito Stubbing的文章。