Posted on 2007-01-03 14:19
itspy 閱讀(916)
評論(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();
?}