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
<krishnan.1...@gmail.com>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 <fernc...@gmail.com> 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
> > <krishnan.1...@gmail.com>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.
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to google-guice@googlegroups.com
To unsubscribe from this group, send email to 
google-guice+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to