Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何覆盖@ContextSingleton进行RoboGuice测试?_Android_Testing_Dependency Injection_Roboguice - Fatal编程技术网

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
为每个
上下文创建一个实例?如果是,那么这就是我想要的答案:)