2014-09-01 95 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