我发现,亦常在我的代码我这样做(使用吉斯我的DI框架):依赖注入和观察者模式
public class SomeObserver implements IObserver {
@Inject
SomeObserver(IObservable observable) {
observable.subscribe(this);
}
// Snip
}
它发生在我最近,当测试,我现在需要的至少将一个模拟传递给我的程序,这并不一定是最糟糕的事情,但它至少依赖于该接口的依赖关系。另一种选择是,在生产中,做到这一点:
public class SomeModule extends AbstractModule {
// snip
@Provides
protected SomeObserver provideSomeObserver(IObservable observable) {
SomeObserver newObject = new SomeObserver();
newObject.subscribe(observable);
}
}
然后在测试中,我没有甚至到Observable
参考。但是,如果我想更改构造函数,模块也必须更改(在第一个示例中它不会)。
哪个更好?还是有更好的第三选择?
更新:我想谈一谈我的用例。
考虑一个数据处理应用程序,其中数据源是Observable。我不想让数据源了解系统的其他部分(Separation of Concerns)。数据被过滤到至少三个不同的观察者中,他们从事独立的任务。我想保持数据源可交换 - 用于测试,分离问题等原因,所以数据源只是实现我定义的接口,然后您可以拨打.subscribe(this)
。
然后,我使用依赖注入和模块来确定接线如何。如果我选择这个解决方案,我还可以使用注释来澄清注入。
因此,本质上,我使用依赖注入来管理布线,这正是我最初认为的原因;创造,例如,ObservationManager
似乎很多boilerplate收益不大。但是,我可能会错过一些东西。
活动巴士怎么样? – condit
@condit同样的问题,那么我需要模拟事件总线或者至少创建一个对它的引用。如果我在测试用例中手动传递消息,那么这不相关。 – durron597
您仍然可以在测试中使用事件总线的实例。使用Guava的'EventBus',这就像每个测试(或测试套件,如果你愿意)实例化一个新事物一样简单,并且使用'EventBus'。而不是将它传递给构造函数(或第二个例子中的提供者)。 – moofins