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

时间:2017-10-09 10:40:15

标签: java spring unit-testing junit 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() {}
}

现在我想为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 - 工厂方法可能会优雅吗?我还没有考虑到这一点。

2 个答案:

答案 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;