Junit使用Spring和Hibernate测试DAO层

时间:2013-02-26 08:32:40

标签: spring hibernate junit

我尝试测试简单的类:

public class GenericDAO {

    @Autowired
    protected SessionFactory sessionFactory;

    public <T> Serializable create(final T o) {
        return sessionFactory.getCurrentSession().save(o);
    }

    @SuppressWarnings("unchecked")
    public <T> T find(final Class<T> cl, final long id) {
        return (T) sessionFactory.getCurrentSession().get(cl, id);
    }

    @SuppressWarnings("unchecked")
    public <T> T update(final T o) {
        return (T) sessionFactory.getCurrentSession().merge(o);
    }

    public <T> void delete(final T o) {
        sessionFactory.getCurrentSession().delete(o);
    }

    @SuppressWarnings("unchecked")
    public <T> List<T> getAll(final Class<T> cl) {
        return (List<T>) sessionFactory.getCurrentSession()
                .createCriteria(cl).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }
}

在我的测试类中,我使用@Before创建会话并填充数据库进行测试,如下所示:

    @Autowired
    protected SessionFactory sessionFactory;    

    @Before
    public void setUp() {
        Session session = sessionFactory.getCurrentSession();
        session.save(user);
        session.save(user1);
        session.save(user2);
        session.flush();
        // Otherwise the query returns the existing order 
        session.clear();
    }

至于我,最好使用@BeforeClass来填充db,因为我需要在课程开始时只创建一次测试日期。但是这个方法必须是静态的,所以我不能自动连接sessionFactory。那么什么是最好的解决方案?

1 个答案:

答案 0 :(得分:1)

我解决这个问题的方法是以一种方式实现DataSource,以便将所有方法调用转发给真实数据源。

当我从DataSource请求连接时,我检查这是否是第一个连接(只是一个布尔标志)。如果是,我在返回连接之前设置数据库。

伪代码:

getConnection() {
    conn = delegate.getConnection()
    if( firstConnection ) {
        firstConnection = false;
        setupDatabase( conn );
    }
    return conn;
}

这也使数据库设置变得懒惰。

注意:您的代码会测试许多您不应该使用的内容:Hibernate,JDBC,数据库驱动程序和数据库。通常,您应该假设这些部分可以工作或由其他人测试。

对于大多数测试,它应该足够mock the GenericDAO

相关问题