0

我尝试测试简单的类:

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 来填充数据库,因为我只需要在上课开始时创建一次测试日期。但是这个方法必须是静态的,所以我不能自动装配 sessionFactory。那么什么是最好的解决方案呢?

4

1 回答 1

1

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

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

伪代码:

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

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

注意:你的代码测试了很多你不应该测试的东西:Hibernate、JDBC、DB 驱动程序、数据库。通常,您应该假设这些部件可以工作或由其他人测试。

对于大多数测试,模拟GenericDAO.

于 2013-02-26T08:40:27.393 回答