Java Guice-从覆盖内访问原始值

Java Guice-从覆盖内访问原始值,java,guice,Java,Guice,在测试中我想包装另一个模块已经提供的对象。 基本上是这样的(但有效): 有没有办法做到这一点?我找到的唯一解决方案是在覆盖中执行此操作: @Provides @Singleton public Tacker getTacker(Ticker ticker) { return new Tacker(new SpyingTicker(ticker)); } 这是不理想的,因为它复制了原始模块的逻辑,并且没有在任何地方替换“Tick

测试中我想包装另一个模块已经提供的对象。 基本上是这样的(但有效):

有没有办法做到这一点?我找到的唯一解决方案是在覆盖中执行此操作:

        @Provides @Singleton
        public Tacker getTacker(Ticker ticker) {
          return new Tacker(new SpyingTicker(ticker));
        }

这是不理想的,因为它复制了原始模块的逻辑,并且没有在任何地方替换“Ticker”的注入(只是在创建“Tacker”)

因为这是一个测试,最好的解决方案是简单地替换另一个团队提供的整个模块。这允许您以您认为合适的方式更改绑定。然而,我可以理解,如果只有一个变化,你为什么不想这样做

如果你能让另一个团队做一些小的改变,我可以尝试以下方法:

public class ProductionModule extends AbstractModule {
    protected void configure() {
        // snip
    }

    @Provides @Singleton
    protected MyObject provideMyObject(Dependency dependency) {
        return delegateProvide(dependency);
    }

    // note the lack of annotations
    protected MyObject delegateProvide(Dependency dependency) {
        return new MyObject(dependency);
    }
}
然后,在测试中:

public class TestModule extends ProductionModule {
   @Override
   protected MyObject delegateProvide(Dependency dependency) {
       return new MyObjectSpy(super.delegateProvide(dependency));
   }
}

这是集成测试还是单元测试?这是集成测试。我想计算一个真实对象的某个方法被调用的次数。所以我将它包装在代理中,但我需要能够插入代理,代理需要能够调用原始对象。。。你不能改变它吗?或者你不能经常改变它?这是另一个团队项目的一部分。从理论上讲,如果我有一个很好的理由,我可以改变它,但我希望有一个更少的侵入性的方式来解决这个IMO相当普遍的问题。这不是我第一次在考试中需要这样的东西。我认为另一个团队会不赞成把他们的代码复杂化,这样我的几个LVL就可以编写测试了。
public class TestModule extends ProductionModule {
   @Override
   protected MyObject delegateProvide(Dependency dependency) {
       return new MyObjectSpy(super.delegateProvide(dependency));
   }
}