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

Java 在Guice中构造对象时为字段提供对象,java,guice,Java,Guice,假设我有类Z,它注入类A: class Z { @Inject public Z(.., A arg, ..) { .. } } 假设类A具有此构造函数: @Inject public A(B arg0, C arg1, D arg2) { ... } 我希望注入正常工作,除非在特殊情况下,我想提供一个参数。e、 例如,使用C类的cObject构造一个。请注意,A本身是使用Z构造的 我之所以想要这个,是因为我正在为Z编写一个功能测试,我想根据测试提供不同种类的赝品。一个

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

class Z {
  @Inject
  public Z(.., A arg, ..) {
    ..
  }
}
假设类A具有此构造函数:

@Inject
public A(B arg0, C arg1, D arg2) {
 ...
}
我希望注入正常工作,除非在特殊情况下,我想提供一个参数。e、 例如,使用C类的cObject构造一个。请注意,A本身是使用Z构造的

我之所以想要这个,是因为我正在为Z编写一个功能测试,我想根据测试提供不同种类的赝品。一个测试文件将只包含B、C或D的一种伪代码。

我建议使用这里,这里有关于其用于功能测试的文档。尽量少用,否则事情会变得非常混乱,很难理解,但它看起来是这样的:

@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);
        }
      }));
}
或者,在
模块.重写
文档中,只需使用较小的模块进行更精细的组合:

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

可能是一个建设者模式可以帮助吗?@Octopus,你能解释一下怎么做吗?谢谢。
Builder
模式帮助您根据需求传递任意数量的参数。您只能传递所需的参数。请检查建设者模式是否符合您需要的测试,考虑避免依赖注入,并手动提供所有依赖关系。这样你几乎肯定会得到更好的代码。在我的情况下,我会用mock覆盖。我想我应该更喜欢Modules.override在这种情况下,是吗?这完全取决于您的模块的粒度,以及您是尝试替换一个完整模块的绑定,还是只替换一个大模块中的一个。模块布局和粒度没有单一的最佳实践,因此选择一个最适合您的模块结构。祝你好运