代码之家  ›  专栏  ›  技术社区  ›  daniu

Mockito:如何模拟javax。注射提供者创建了原型bean?

  •  7
  • daniu  · 技术社区  · 9 年前

    我有一个单例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测试:

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

    但可以理解的是,这并没有正确地设置单身者的 Provider .

    有什么办法吗?我希望避免创建创建原型实例的单例工厂bean。

    或者,使用 @Lookup

    2 回复  |  直到 8 年前
        1
  •  9
  •   Maciej Kowalski    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();
    }
    

    Mockito Stubbing 如果你需要进一步阅读。

        2
  •  0
  •   Артур Курицын    7 年前
    @Mock 
    MyPrototype prototype;
    
    @Spy
    Provider<MyPrototype> prototypeProvider = new Provider<MyPrototype>() {
        public MyPrototype get() {return prototype;}
    };
    
    @InjectMocks 
    MySingleton sut;