2009/6/28 Karthik Krishnan <[email protected]>

> @Rodrigo: Thanks for the tip: I will try that
>
> @Adrian: Can we use OSGI with Guice?


yes... http://code.google.com/p/google-guice/wiki/OSGi

but be mindful of:

   http://code.google.com/p/google-guice/issues/detail?id=311
   http://code.google.com/p/google-guice/issues/detail?id=337
   http://code.google.com/p/google-guice/issues/detail?id=343

all of which have suggested patches and are targeting 2.1


> On Sat, Jun 27, 2009 at 9:17 AM, Adrian Cole <[email protected]> wrote:
>
>> Well, this is why I am currently working on osgi.  Switching modules seems
>> to imply some coupling you probably don't want.
>>
>> That said, without osgi, here's what we do: parse a list of modules,
>> adding defaults if no overrides are present.  How you add additional modules
>> could be a varargs factory method (Module ... modules),
>> Class.forName(overrideModuleName), etc.
>>
>> Here's an example how we inspect modules to satisfy the requirements of
>> our code.
>>
>>    private Injector createInjector() {
>>
>>       useDefaultPortIfNotPresent(properties);
>>
>>       addLoggingModuleIfNotPresent(modules);
>>
>>
>>       addS3ParserModuleIfNotPresent(modules);
>>
>>       addS3ConnectionModuleIfNotPresent(modules);
>>
>>       addHttpModuleIfNeededAndNotPresent(modules);
>>
>>       modules.add(new AbstractModule() {
>>          @Override
>>
>>
>>          protected void configure() {
>>             Names.bindProperties(binder(), checkNotNull(properties, 
>> "properties"));
>>          }
>>       });
>>       modules.add(new S3ContextModule());
>>
>>       return Guice.createInjector(modules);
>>
>>
>>    }
>>
>> I hope this helps.
>> -Adrian
>>
>>
>> On Sat, Jun 27, 2009 at 9:45 AM, Karthik Krishnan <
>> [email protected]> wrote:
>>
>>>
>>> Adrian: Thanks for your reply: For unit tests, I am mocking behavior
>>> for the dao class. Ideally I would like to use DM based datasources
>>> for my integration tests and JNDI based data sources for my
>>> application to unit test the entire work flow.
>>>
>>> In Spring it is so easy to do this. I just swap one xml with another
>>> and let Spring framework handling the switch seamlessly. Idon't know
>>> how to get Guice to do it for me without having to change the module
>>> instance.
>>>
>>> On Jun 26, 11:51 pm, Adrian Cole <[email protected]> wrote:
>>> > Hi, Krishnan,
>>> >
>>> > I'd extract MyDao's interface and move the other code to
>>> DataSourceMyDao.
>>> > For unit tests, you can mock the behaviour in MyDao specific to that
>>> test.
>>> > pita perhaps, but fairly normal.  Creating a more versatile StubMyDao
>>> would
>>> > involve some work.  In jclouds, this proved useful, as it helps you
>>> load
>>> > test your code, as opposed to your db.
>>> >
>>> > All this said, you could always fire up an in-process db like derby or
>>> > hsqldb.  Less work, but it isn't really unit testing at that point ;)
>>> >
>>> > my 2p.
>>> > -Adrian
>>> > jclouds <http://code.google.com/p/jclouds>
>>> >
>>> > On Sat, Jun 27, 2009 at 7:57 AM, Karthik Krishnan
>>> > <[email protected]>wrote:
>>> >
>>> >
>>> >
>>> > > Hi Guice Gurus,
>>> >
>>> > > I am just playing with Guice 2.x and I am stuck with an issue that I
>>> > > can not resolve. Any help would be appreciated.
>>> >
>>> > > I have a service class that takes DAO class as a constructor argument
>>> > > that connects to the data base. The dao class accepts a data source
>>> as
>>> > > a constructor argument. I have created two modules : the first one
>>> > > injects a JNDI based data source, the other DriverManager based data
>>> > > source. I would like
>>> >
>>> > > public class MyService {
>>> >
>>> > >  private final MyDao myDao;
>>> >
>>> > >  public MyService(MyDao myDao) {
>>> > >     this.myDao = myDao;
>>> > >  }
>>> >
>>> > >  ....
>>> >
>>> > > }
>>> >
>>> > > public class MyDao {
>>> > >   private final DataSource dataSource;
>>> >
>>> > >   @Inject
>>> > >   public MyDao(DataSource dataSource) {
>>> > >      this.dataSource = dataSource;
>>> > >   }
>>> >
>>> > >  ....
>>> > > }
>>> >
>>> > >  My modules:
>>> >
>>> > > public class JndiDataSourceModule extends AbstractModule {
>>> >
>>> > >   public void configure() {
>>> > >      bind(DataSource.class).toProvider(JndiIntegration.fromJndi
>>> > > (DataSource.class, "myDatasource"));
>>> > >   }
>>> > > }
>>> >
>>> > > public class DriverManagerDataSourceModule extends AbstractModule {
>>> > >   @Provides
>>> > >    DataSource getDataSource() {
>>> > >       return DriverManagerDataSource(driverClass, url, username,
>>> > > password);
>>> > >    }
>>> >
>>> > >   ....
>>> > > }
>>> >
>>> > > I can not figure out how to inject DriverManager based DataSource for
>>> > > unit tests and JNDI based datasource in my application. I was
>>> thinking
>>> > > of passing modules in the constructor of my service class but I don't
>>> > > think I would be able to mock my MyDao for exceptional conditions.
>>> > > Any help would be appreciated.
>>>
>>>
>>
>>
>>
>
> >
>


-- 
Cheers, Stuart

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to