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));
}
}