在Guice中为构造对象的字段提供对象

时间:2014-03-25 04:57:28

标签: java guice

假设我有Z类,它注入A类:

class Z {
  @Inject
  public Z(.., A arg, ..) {
    ..
  }
}

假设A类有这个构造函数:

@Inject
public A(B arg0, C arg1, D arg2) {
 ...
}

我希望注入正常工作,除非在特殊情况下,我想提供其中一个参数。例如,使用C类的cObject构造A.请注意,A本身是使用Z构建的。

我想要这个,因为我正在为Z编写功能测试,我想根据测试提供不同类型的假动作。一个测试文件只包含一种假冒B,或C或D。

1 个答案:

答案 0 :(得分:2)

我建议在这里使用Modules.override,其中包含有关其用于功能测试的文档。谨慎使用它,因为事情可能变得非常混乱而且难以遵循,但它看起来像这样:

@Before
public void createInjector() {
  this.injector = Guice.createInjector(
      Modules.override(new YourZABCDModule()).with(new AbstractModule() {
        @Override public void configure() {
          bind(B.class).to(FakeB.class);
        }
      }));
}

或者,与Modules.override文档中一样,只需使用较小的模块即可实现更细粒度的组合:

@Before
public void createInjector() {
  this.injector = Guice.createInjector(
      new ZAModule(),
      new FakeBModule(),
      new CModule(),
      new DModule());
}