It depends on what you want. If you want constructor injection, then
guiceModule might be a way to go. If method or field injection is fine with
you then you can implement TestNG's IObjectFactory.
public class MyObjectFactory implements IObjectFactory {
public final Object newInstance(@SuppressWarnings("unchecked") final
Constructor constructor, final Object... args) {
ObjectFactoryImpl impl = new ObjectFactoryImpl();
Object testInstance = impl.newInstance(constructor, args);
Injector injector =
Guice.createInjector(this.overrideAbstractMethodToReturnListOfModules());
injector.injectMembers(testInstance);
}
}
On Thu, Oct 27, 2011 at 1:12 PM, Jeff <[email protected]> wrote:
> The classes containing the injected fields are TestNG test classes. I am
> creating the Injector using the ServiceLoader mechanism within a class that
> implements org.testng.ISuiteListener. TestNG automatically picks up and
> runs the onStart() method before doing anything else and I call
> createInjector() there.
>
> Though, I think I just realized my problem (besides trying to learn/use
> Guice from within another framework I'm also just learning).
>
> The key bit I had not grasped previously was that for Guice/@Inject to
> work, object instantiation must be done directly by Guice
> (Injector.getInstance()), at least for the root node of the object graph (I
> think).
>
> Since TestNG instantiates classes without Guice by default, it was just
> creating normal instances and the @Inject annotations weren't getting
> processed.
>
> TestNG does support Guice via @Test(guiceModule = MyModule.class)annotation,
> but I wanted to avoid the need to put this on EVERY test class
> and thought I could insert my Modules/Providers and enable my custom
> bindings to work globally.
>
> I'm still playing with my code, but I feel like I'm on the right track.
> Can anyone confirm or help me understand if there is a different way?
>
> Thanks!!
>
> On Thu, Oct 27, 2011 at 5:40 AM, Stuart McCulloch <[email protected]>wrote:
>
>> On 27 Oct 2011, at 06:14, Jeff wrote:
>>
>> I want to do something like:
>>
>> @Inject @Named("conf")
>> Properties config;
>>
>> @Inject @Named("lang")
>> Properties language;
>>
>> Where these objects are singletons initialized once at runtime with
>> environment-specific information.
>>
>> I've tried various things and none result in my Provider or @Provides
>> methods getting called. Here is a trimmed down version of my code using a
>> Provider class:
>>
>> *MyModule.java:*
>>
>> public class SeleniumInjectionModule extends AbstractModule {
>> @Override
>> protected void configure() {
>>
>> bind(Properties.class).annotatedWith(Names.named("conf")).toProvider(ConfigProvider.class);
>>
>> bind(Properties.class).annotatedWith(Names.named("lang")).toProvider(LanguageProvider.class);
>>
>> }
>> }
>>
>> *ConfigProvider.java:*
>>
>> @Singleton
>> public class ConfigProvider implements Provider<Properties> {
>> private final Properties config = new Properties();
>>
>> public ConfigProvider() {
>> //Load properties file based on 'config' system property value set in
>> Maven profile
>> ...
>> config.load(...);
>> ...
>> }
>> @Override
>> public Properties get() {
>> return config;
>> }
>> }
>>
>>
>> *LanguageProvider.java:*
>>
>> @Singleton
>> public class LanguageProvider implements Provider<Properties> {
>> private final Properties lang = new Properties();
>>
>> public LanguageProvider() {
>> //Load properties file based on 'language' system property value set
>> in Maven profile
>> ...
>> lang.load(...);
>> ...
>> }
>> @Override
>> public Properties get() {
>> return lang;
>> }
>> }
>>
>> * In my Global Init code:*
>> Guice.createInjector(new MyModule());
>>
>> What am I missing?
>>
>>
>> Where's the class containing the injected config/language fields mentioned
>> in the start of this email?
>>
>> Assuming that class is called Foo then you need to use
>> injector.getInstance(Foo.class) - or injector.injectMembers(myFoo) if you
>> already have an instance of Foo - to start the injection process and inject
>> those fields. Note that you don't need to do this for everything, just the
>> class at the beginning of the injection graph to kick things off.
>>
>> --
>> Jeff Vincent
>> [email protected]
>> See my LinkedIn profile at:
>> http://www.linkedin.com/in/rjeffreyvincent
>> I ♥ DropBox <http://db.tt/9O6LfBX> !!
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "google-guice" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected].
>> For more options, visit this group at
>> http://groups.google.com/group/google-guice?hl=en.
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "google-guice" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected].
>> For more options, visit this group at
>> http://groups.google.com/group/google-guice?hl=en.
>>
>
>
>
> --
> Jeff Vincent
> [email protected]
> See my LinkedIn profile at:
> http://www.linkedin.com/in/rjeffreyvincent
> I ♥ DropBox <http://db.tt/9O6LfBX> !!
>
> --
> You received this message because you are subscribed to the Google Groups
> "google-guice" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/google-guice?hl=en.
>
--
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-guice?hl=en.