gpt4 book ai didi

java - Mockito:如何模拟 javax.inject.Provider 创建的原型(prototype) bean?

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:55 26 4
gpt4 key购买 nike

我有一个创建原型(prototype) bean 的单例 Spring 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 测试:

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

但可以理解的是,它没有正确设置 Singleton 的 Provider

有什么办法吗?我想避免创建一个创建原型(prototype)实例的 Singleton Factory bean。

或者,是否可以优雅地为 Singleton 使用 @Lookup 工厂方法?我还没有调查过。

最佳答案

我会 stub 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();
}

我在 Mockito Stubbing 上写了一篇文章如果您需要进一步阅读。

关于java - Mockito:如何模拟 javax.inject.Provider 创建的原型(prototype) bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46644500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com