让Guice的FactoryModuleBuilder创建一个返回模拟的工厂?

时间:2013-10-21 05:39:08

标签: java guice mockito

在我的应用程序中,我使用FactoryModuleBuilder自动创建某个类的实例:

new AbstractModule() {
  @Override
  protected void configure() {
    install(new FactoryModuleBuilder().implement(A.class,B.class).build(A.AFactory.class));
  }
});

在我的测试中,我真的不想使用实现(B类),所以我想配置一个模块,以便工厂返回一个像这样的Mockito模拟:

new AbstractModule() {
  @Override
  protected void configure() {
    install(new FactoryModuleBuilder().implement(A.class,myMockInstance).build(A.AFactory.class));
  }
});

显然上面的内容没有意义,因为呢()告诉我应该将哪个实现用于接口A,但是我希望它能让我明白我希望创建的工厂使用我的模拟对象。然后我就像往常一样使用我的模拟器:

Mockito.when(myMockInstance.doStuff()).thenReturn(result);

这是可能的还是我必须手动创建一个实现A的C类,它将充当模拟器?

1 个答案:

答案 0 :(得分:5)

为什么要使用FactoryModuleBuilder?它存在以自动处理从@AssistedA.AFactory的构造函数的B参数,但在测试中您不需要 - 尤其是在工厂返回模拟时。相反,嘲笑你自己的A.AFactory,并通过Guice访问它。

final A myMockInstance = createAMock();
new AbstractModule() {
  @Override protected void configure() {}

  @Provides
  A.AFactory createAFactory() {
    A.AFactory factory = mock(A.AFactory.class);
    when(factory.createA(anyString(), anyInt(), any(Dependency.class)))
        .thenReturn(myMockInstance);
    return factory;
  }
});

我在这里使用了@Provides方法,但您可以轻松编写自己的五行A.AFactory,然后使用bind(A.AFactory.class).to(AFactoryForTest.class)进行绑定,或者在其他位置设置模拟工厂,{ {1}}。