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