Android 如何覆盖@ContextSingleton进行RoboGuice测试?
我正试图用一个特定的测试模块来覆盖几个测试注入。这对真正的单身汉来说效果很好,比如:Android 如何覆盖@ContextSingleton进行RoboGuice测试?,android,testing,dependency-injection,roboguice,Android,Testing,Dependency Injection,Roboguice,我正试图用一个特定的测试模块来覆盖几个测试注入。这对真正的单身汉来说效果很好,比如: ...custom module... bind(SomeClass.class).toInstance(instanceOfMockedClass); ... 现在,当需要覆盖contextsingleton时,这就带来了问题。显然,像上面这样做会为所有上下文(服务、活动)注入相同的实例,其中单独的实例是正确的。我试图对ContextScopedProvider进行思考,但找不到在bind(…).toPro
...custom module...
bind(SomeClass.class).toInstance(instanceOfMockedClass);
...
现在,当需要覆盖contextsingleton
时,这就带来了问题。显然,像上面这样做会为所有上下文(服务、活动)注入相同的实例,其中单独的实例是正确的。我试图对ContextScopedProvider
进行思考,但找不到在bind(…).toProvider(…)
构造中实际使用它的方法,因为该类本身没有实现Guice的提供程序
接口
如何做到这一点
(也被问到)另一种写法是这样的
bind(SomeClass.class).toProvider(SomeClassProvider.class).in(Singleton.class);
如果这样做的话,就不需要在绑定时让实例可用,这虽然对单例来说很好,但显然对ContextSingleton不起作用,因为还没有上下文
您可以对ContextSingleton使用相同类型的绑定:
bind(SomeClass.class).toProvider(SomeClassProvider.class).in(ContextSingleton.class);
现在,RoboGuice为您注入的SomeClass的所有实例都将被正确地限定范围,无论是Singleton还是ContextSingleton。现在,问题是我需要确定触发注入的上下文。我的用例是,我有一个服务和一个活动,它们都应该注入roboguice的EventManager(我出于不同的原因想要覆盖它)。因此,我需要确保每个可用上下文都有一个重写实例,否则组件之间的事件机制将不再工作(如果每个组件都有自己的实例),或者我在活动上下文中抛出的事件也会到达服务上下文,只要使用ContextSingleton绑定覆盖的EventManager的每个实例,每个上下文都应该有自己的EventManager。请注意:如果混合使用绑定和注释,则绑定将始终优先,注释将被忽略。因此,如果您有一个@ContextSingleton注释,但您编写了一个
bind(X.class).toProvider(Y.class)代码>,X将不再是ContextSingleton,即使它有@ContextSingleton注释。那么您是说绑定(SomeClass.class).toProvider(SomeClassProvider.class).in(ContextSingleton.class)
应该发挥神奇的作用,即它只允许SomeClassProvider
为每个上下文创建一个实例?如果是,那么这就是我想要的答案:)