Posted on 2007-01-03 14:19
itspy 阅读(904)
评论(0) 编辑 收藏 所属分类:
JAVA技术
如何在单元测试时,对Appfuse中POJO的属性进行自动装载(经过事后分析发现,不仅仅是针对POJO)
在Appfuse中,对DAO类进行单元测试时有如下代码
private UserDao dao = null;
private RoleDao rdao = null;
public void setUserDao(UserDao dao) {
this.dao = dao;
}
public void setRoleDao(RoleDao rdao) {
this.rdao = rdao;
}
通过架构,这两个Dao类都进行了自动装载,后来的使用中,我才发现,所有类似的属性都可以实现自动装载.
这我就奇怪了,如果这些类是在Spring的ApplicationContext中设置的,我还知道,Spring提供了很多途径来解决自动装载问题.但是这些单元测试的类,都是由它们来管理生成ApplicationContext的,怎么也实现了自动装载?
经常查看源码,才知道原来是Appfuse架构中对DAO进行单元测试的类有一个共同的父类AbstractDependencyInjectionSpringContextTests,这个父类得到生成的ApplicationContext,会检查自己有没有一些属性要实现自动装载的,如果有就到ApplicationContext中去找,找到了就把自己子类的属性实现自动装载.
最核心的代码是:AbstractDependencyInjectionSpringContextTests中有如下方法
private void injectDependencies() throws Exception {
if (isPopulateProtectedVariables()) {
if (this.managedVariableNames == null) {
initManagedVariableNames();
}
populateProtectedVariables();
}
else if (getAutowireMode() != AUTOWIRE_NO) {
this.applicationContext.getBeanFactory().autowireBeanProperties(
this, getAutowireMode(), isDependencyCheck());
}
}
AbstractSingleSpringContextTests类中定义了下面的方法,这个方法实现了Junit的类TestCase定义的方法,这个方法会在每个方法之前运行。
protected final void setUp() throws Exception {
this.applicationContext = getContext(contextKey());//这个contextKey方法会调用BaseDaoTestCase中定义的getConfigLocations方法
prepareTestInstance();
onSetUp();
}