> Are you planning on serialising your DAOs?

No -- I mark them as "transient".

> How will you mock out your "Locator" for unit tests?

I didn't provide the implementation in the parent, but it's pretty obvious:

        /** Use for unit tests */
        public static class MockLocator extends Locator {
           HashMap<String, Object> map= new HashMap<String, Object>();
        
           Object find(String name) {
              return map.get(name);
           }
        
           public void put(String name, Object value) {
              map.put(name, value);
           }
        }

        class MyTest extends TestCase {
           void setUp() {
              MockLocator mockLocator= new MockLocator();
              MyDAO dao= new MyDAO(...);
              mockLocator.put("dao", dao);
              Locator.register(mockLocator);
           }
        }

Hope this makes sense.

jWeekend wrote:
Are you planning on serialising your DAOs?
How will you mock out your "Locator" for unit tests?

Regards - Cemal
http://www.jWeekend.co.uk http://jWeekend.co.uk


Sasha O-2 wrote:
Dear All --

I was having an issue with @SpringBean injection -- my dao class was not initialized properly with the dependent beans. I spent some time exploring internals of CGLib and Spring Injections and then a thought struck me: how really helpful is this injection?

Consider this code:

        class MyPage extends Page {
           ...
           @SpringBean
           MyDAO dao;
           ...
        }

vs. this code:

        class MyPage {
           ...
           MyDAO dao= Locator.find("myDAO", MyDAO.class);
           ...
        }

The Locator is a pretty straightforward guy who pulls ApplicationContext out of thin air^^^^^ThreadLocal variable and looks up on it, see the example code below.

The former uses annotations, CGLIB and delicate injection. The latter uses nothing and is a lot simpler and robust. Aside from marginal savings in typing I couldn't find any advantages of the former approach. Can you?

Unless convinced otherwise, I am going to skip the @SpringBean altogether and use the Locator thing in my application.

Thanks,
-- Sasha

-----------------------------------------------------------------------
public abstract class Locator {
        
        abstract Object find(String name);
        
        static Locator locator= null;
        
        public static Locator register(Locator inLocator) {
                Locator result= locator;
                locator= inLocator;
                return result;
        }
        
        public static class SpringLocator extends Locator {
ApplicationContext context= WebApplicationContextUtils.getRequiredWebApplicationContext(
                                WebApplication.get().getServletContext());
                Object find(String name) {
                        return context.getBean(name);
                }
        }
        
        /** To be called in the application initialization */
        public static void registerSpringLocator() {
                register(new SpringLocator());
        }
        
        /** Use for unit tests */
        public static class MockLocator extends Locator {
                @Override
                Object find(String name) {
                        // TODO implement
                        return null;
                }
        }
        
        public static<T> T find(String name, Class<T> clazz) {
                Object found= locator.find(name);
                if (found==null)
                        return null;
                return clazz.cast(found);
        }
}
-----------------------------------------------------------------------


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to