使用JUnit测试我的dao层:使用JavaConfig进行Spring和hibernate

时间:2014-09-01 19:06:46

标签: spring hibernate junit

我正在使用hibernate和spring安全性的spring web应用程序。

在实现DAO(使用通用dao模式)并为SpringUserDetails创建CustomUserDetailService以实现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 Handler拦截了它并将我重定向到带有此例外的错误页面:

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));
    }
}

我没有弄到什么问题。

2 个答案:

答案 0 :(得分:1)

使用Java创建测试用例的配置,

在测试类上使用这些注释。

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

}

和Config.class看起来像,

@Configuration
public class Config {
}

在Config类中定义bean并执行测试用例。

2) 很清楚,No session表示在调用您的DAL的图层中没有定义TransactionManager

尝试使用@Transactional为您做到这一点。

注意:请确保@Transactional允许默认为transactionManager的值属性

答案 1 :(得分:0)

关于第二部分2),我找到了解决方案,我必须将@Transactional添加到我的服务中,this帖子帮助了我

相关问题