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



我有一个单例 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;

相关内容

  • 没有找到相关文章