【问题标题】:How can @ContextSingletons be overridden for testing with RoboGuice?如何覆盖 @ContextSingleton 以使用 RoboGuice 进行测试?
【发布时间】:2013-04-17 10:44:45
【问题描述】:

我正在尝试覆盖几个注入以使用特定的测试模块进行测试。这对于像这样的真正单身人士来说效果很好:

...custom module...
bind(SomeClass.class).toInstance(instanceOfMockedClass);
...

现在,当需要覆盖 ContextSingletons 时,这会带来问题。像上面那样做同样的事情显然会为所有上下文(服务、活动)注入相同的实例,其中一个单独的实例本来是正确的。我试图绕开ContextScopedProvider,但找不到在bind(...).toProvider(...) 构造中实际使用它的方法,因为这个类本身没有实现Guice 的Provider<T> 接口。

如何做到这一点?

(也在https://groups.google.com/forum/?fromgroups=#!topic/roboguice/MnWGrHFDOsQ上提问)

【问题讨论】:

    标签: android testing dependency-injection roboguice


    【解决方案1】:

    为常规单例编写的另一种方法是这样的

    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注解。
    • 那么您是说bind(SomeClass.class).toProvider(SomeClassProvider.class).in(ContextSingleton.class); 应该完全发挥作用,即它只允许SomeClassProvider 每个Context 创建一个实例?如果是,那么这就是我正在寻找的答案:)
    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2017-07-26
    • 2019-05-11
    • 1970-01-01
    • 2017-05-03
    • 2021-10-28
    • 2017-10-31
    相关资源
    最近更新 更多