posts - 82, comments - 269, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
如何在单元测试时,对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();
 }

只有注册用户登录后才能发表评论。


网站导航: