Как можно переопределить @ContextSingletons для тестирования с помощью RoboGuice?

Я пытаюсь переопределить пару инъекций для тестирования с помощью определенного тестового модуля. Это отлично работает, как и для настоящих синглетонов, например:

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

Теперь это создает проблемы, когда ContextSingletons нужно перезаписать. Выполнение того же, что и выше, очевидно, вводит один и тот же экземпляр для всех контекстов (служб, действий), где был бы правильным отдельный экземпляр. Я попытался разобраться с ContextScopedProvider, но не смог найти способ использовать его в конструкции bind(...).toProvider(...), поскольку сам этот класс не реализует интерфейс Guice Provider<T>.

Как этого добиться?

(также задан вопрос на https://groups.google.com/forum/?fromgroups=#!topic/roboguice/MnWGrHFDOsQ)


person Thomas Keller    schedule 17.04.2013    source источник


Ответы (1)


Альтернативный способ написать это для обычного синглтона будет примерно таким

bind(SomeClass.class).toProvider(SomeClassProvider.class).in(Singleton.class);

Если вы сделаете это таким образом, вам не нужно иметь доступный экземпляр во время привязки, что, хотя и подходит для Singleton, очевидно, не будет работать для ContextSingleton, поскольку контекста еще нет.

Вы можете использовать тот же тип привязки для ContextSingleton:

bind(SomeClass.class).toProvider(SomeClassProvider.class).in(ContextSingleton.class);

Теперь все экземпляры SomeClass, которые RoboGuice внедряет для вас, будут иметь правильную область действия, будь то Singleton или ContextSingleton.

person emmby    schedule 22.04.2013
comment
Теперь проблема в том, что мне нужно определить, в каком контексте срабатывает инъекция. Мой вариант использования заключается в том, что у меня есть служба и действие, которые должны вводить EventManager roboguice (который я хочу переопределить по разным причинам). Поэтому мне нужно убедиться, что у меня есть ровно один переопределенный экземпляр для каждого доступного контекста, иначе механизм событий между компонентами больше не будет работать (если каждый компонент получит свой собственный экземпляр) или события, которые я вызываю в контексте действия, также достигают контекста службы. , чего я не хочу. - person Thomas Keller; 22.04.2013
comment
Пока вы связываете каждый экземпляр вашего переопределенного EventManager с помощью ContextSingleton, каждый контекст должен получить свой собственный EventManager. Имейте в виду: если вы смешиваете привязки и аннотации, привязки всегда будут иметь приоритет, а аннотации будут игнорироваться. Поэтому, если у вас есть аннотация @ContextSingleton, но вы пишете bind(X.class).toProvider(Y.class);, X БОЛЬШЕ НЕ будет ContextSingleton, даже если у него есть аннотация @ContextSingleton. - person emmby; 22.04.2013
comment
Значит, вы говорите, что bind(SomeClass.class).toProvider(SomeClassProvider.class).in(ContextSingleton.class); должен точно творить чудеса, т. е. позволяет SomeClassProvider создавать только один экземпляр на Context? Если да, то это ответ, который я ищу :) - person Thomas Keller; 23.04.2013