2014-09-01 94 views
1

我正在使用休眠和彈簧安全性來開發Spring Web應用程序。使用JUnit測試我的dao層:使用JavaConfig進行Spring和休眠

在實現了DAO(使用通用dao模式)併爲CustomUserDetailService和CustomUserDetails進行spring安全性之後,似乎我無法登錄(我在內存ID中使用並且它正在工作),所以我認爲它必須在我的DAO中是個問題。

1)我使用JavaConfig我的配置,這初始化:

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] { AppConfig.class,SecurityConfig.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return null; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

} 

我以前從未使用過的JUnit測試,我發現使用XML配置的所有例子,所以我需要在其他一些幫助,一個例子會很棒。

2)由於我無法使用JUnit,我試圖弄清楚問題是什麼,所以我添加了一個控制器方法,在那裏我得到一些用戶並在頁面中顯示它們,但是我的GlobalException處理程序攔截並重定向了我此異常的錯誤頁:

org.springframework.orm.hibernate4.HibernateSystemException: No Session found for current thread; nested exception is org.hibernate.HibernateException: No Session found for current thread 

這裏是我的GenericDaoImpl:

public class GenericDaoImpl<T,ID extends Serializable> implements GenericDao<T,ID> { 


    private Class<T> persistentClass; 

    @SuppressWarnings("unchecked") 
    public GenericDaoImpl(Class<T> persistentClass) { 
     this.persistentClass = persistentClass; 
    } 

    @Autowired 
    private SessionFactory sessionFactory; 

    public Session getSession() 
    { 
     return sessionFactory.getCurrentSession(); 
    } 


    @Override 
    public boolean create(T t) { 

     if (t== null) return false; 
     getSession().saveOrUpdate(t); 
     return true; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public T getById(ID id) { 

     return (T) getSession().get(persistentClass,id); 
    } 

    @Override 
    public boolean update(T t) { 

     if (t==null) return false; 
     getSession().update(t); 
     return true; 
    } 

    @Override 
    public boolean delete(T t) { 

     if (t==null) return false; 
     getSession().delete(t); 
     return true; 
    } 

    @Override 
    public boolean deleteById(ID id) { 
     T t =getById(id); 
     if (t==null) return false; 
     getSession().delete(t); 
     return true; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<T> findByOneCriteria(Criterion criterion) { 
     Criteria criteria = getSession().createCriteria(persistentClass); 
     criteria.add(criterion); 
     return (List<T>)criteria.list(); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<T> findByCriterias(ArrayList<Criterion> criterions) { 
     Criteria criteria = getSession().createCriteria(persistentClass); 
     for (Criterion c : criterions) 
     criteria.add(c); 
     return (List<T>)criteria.list(); 
    } 
} 

而且我PersonnelDaoImpl:

@Repository 
public class PersonnelDaoImpl extends GenericDaoImpl<Personnel,Integer> implements PersonnelDao { 

    public PersonnelDaoImpl(){ 
     super(Personnel.class); 
    } 

    @Override 
    public Personnel findByUsername(String username) { 
     List<Personnel> result = findByOneCriteria(Restrictions.like("username",username)); 
     return result.get(0); 
    } 

    @Override 
    public List<Personnel> findByRole(int role) { 
     return findByOneCriteria(Restrictions.eq("role",role)); 
    } 
} 

我沒有得到什麼錯。

+0

值屬性你得到一個異常,當你嘗試登錄? – 2014-09-03 08:14:07

+0

我解決了問題的第二部分(我添加了一個答案),並回答你的問題:不,我得到的例外是當我測試我的服務時(我做了一個可以訪問的頁面,即使用戶沒有登錄在,並使用該服務用於登錄),我得到了上述異常 – Aissasa 2014-09-03 12:12:25

回答

0

關於第二部分2),我找到了解決辦法,我不得不添加@Transactional我的服務,this後幫我

1

創建使用Java測試用例配置,

上使用這些註解你的測試班。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {Config.class}) 
public class ServiceTest{ 

} 

和Config.class會是什麼樣子,

@Configuration 
public class Config { 
} 

定義豆在配置類和執行測試用例。

2) 它很清楚No session表示在調用DAL的圖層中沒有定義TransactionManager

嘗試使用@Transactional這是爲你做的。

注:請確保@Transactional允許其默認爲transactionManager

+0

2)我想,我加了一個答案,現在的問題是與單元測試,它似乎並沒有像你描述的工作上面(我已經試過了),它不需要初始化器嗎?如果是,如何包含它? – Aissasa 2014-09-03 12:14:48

+0

爲什麼單元測試需要事務管理器,每件事情都應該被模擬?你的意思是集成測試? – VinayVeluri 2014-09-03 12:17:01

+0

我正在使用單元測試來檢查我的服務是否正常工作,或者至少,我想檢查我的存儲庫是否正常工作,如果還有其他解決方案,請成爲我的客人^ _ ^ – Aissasa 2014-09-03 12:23:09