@Stuart: Spring Unit Testing Framework allows you to configure a xml file path for it to pick up test configurations. If you were to replace JNDI data source with a DM based on in your test configuration, Spring can it pick it up without any trouble. You don't have to make any changes to your code. http://static.springframework.org/spring/docs/2.5.x/reference/testing.html#junit38-legacy-support http://static.springframework.org/spring/docs/2.5.x/reference/testing.html#testcontext-fixture-di
Consider my example that I provided in my original post. With Guice, to create an instance of Service (I may be wrong), I have to execute the following lines of code in the class that needs to invoke the service to inject my dependencies. Injector injector = Guice.createInjector(new JndiDataSourceModule()); Service service = new Service(injector.getInjector(MyDao.class)); This binds my code to JndiDataSourceModule and I can not override this module with DriverManagerDataSourceModule within my unit tests. Is this a correct assumption? For unit tests, I can create mock objects and can stub my outputs. I am using Mockito for that purpose. For integration tests, I have to test the work flow. So I have to be able to replace JndiDataSourceModule with DriverManagerDataSourceModule for testing purposes. In my example, I would like to replace one data source with other as seamlessly as possible. I am not an expert on Guice and I would be grateful if you would have any advice or tips for me. As for OSGI, I don't want to introduce OSGI yet. My knowledge of OSGI is extremely limited at best so I don't want to introduce anything I don't know yet. Thank you for your time and replying. On Jun 28, 12:30 am, Stuart McCulloch <[email protected]> wrote: > 2009/6/27 Karthik Krishnan <[email protected]> > > > > > 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 > > presumably there's some place in your build or deployment where you make > this swap? Right, I am using Guice in data tier to inject data sources to my daos. > > if so then you could swap the relevant Guice modules at the same point - > either in the > build, or at deployment time by indirectly looking up the modules at runtime > or perhaps > by simply replacing the class on the classpath (say by pre-pending the test > version on > the test classpath) > > afaik there's no reason why swapping classfiles should be harder than > swapping XML > > 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 -~----------~----~----~----~------~----~------~--~---
