当前位置: 首页 > 知识库问答 >
问题:

Mockito:如何模仿javax.inject.Provider创建的原型beans?

国俊艾
2023-03-14

我有一个单例春豆,可以创建原型豆;这些是从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();
}

但是可以理解的是,这并没有正确设置单例的< code>Provider。

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

或者,对单例使用一个< code>@Lookup-factory方法是否很有可能?我还没有研究过这个。

共有2个答案

申屠浩歌
2023-03-14
@Mock 
MyPrototype prototype;

@Spy
Provider<MyPrototype> prototypeProvider = new Provider<MyPrototype>() {
    public MyPrototype get() {return prototype;}
};

@InjectMocks 
MySingleton sut;
郤立果
2023-03-14

我会存根该提供程序,并使其每次使用在每次测试之前调用的 @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的文章。

 类似资料:
  • 我试图用Mockito 1.9.5模拟一个类,但是我很难让它工作。 我写了我的测试样板: ...并得到一个长的< code>ClassCastException: 线程“main”java.lang.ClassCastException中的异常:org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWo

  • 问题内容: 当我创建一个说类Employee的模拟对象时。它不调用Employee对象的构造函数。我知道Mockito在内部使用CGLIb和反射,创建了一个代理类,将该类扩展为模拟。如果未调用employee的构造函数,那么如何创建employee类的模拟实例? 问题答案: Mockito使用CGLib生成类对象。但是,要实例化此类对象,它使用Objenesis http://objenesis.

  • 我正在尝试运行此处提供的机器学习和Anylogic仿真示例工作流。-https://www.anylogic.com/features/artificial-intelligence/h2o-ai/我可以运行第二个工作流,但第一个工作流(医院规划)不断出错。我也尝试过在不同的系统上运行它。 我们将非常感谢您的帮助。 以下是错误代码: 加载Mojo:管道。魔咒

  • 我正在尝试将单元测试添加到一些遗留代码中,该代码具有传递给它的String类名,并使用创建一个实现特定处理程序接口的对象。我可以控制我正在传递的类名,我可以获取指向新处理程序对象的指针(通过调用),并且我想使用Mockito观察对它的调用。 我目前的解决方案是: 创建一个实现接口的新测试类。 让该测试类包含一个也实现接口的Mockito mock对象。 手动将所有接口方法传递给模拟对象。 使模拟对

  • 我在一次测试中试图使用一个模拟类,但出现了以下错误: 在pom中: (也试用了3.0.0版) 车辆等级: 测试类:

  • 我正在创建一个maven原型。在这里,我有一个原型项目,当用户调用以下命令时,它会为用户创建: MVN原型:生成-DArchetypeGroupId=xxx-DArchetypeArtifactId=Archtype-yyyy-DArchetypeVersion=1.1.0-S5-SNAPSHOT-DgroupId=zzz-DartifactId=pro11 在prototype pom中,我想使