我尝试测试简单的类:
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。那么什么是最好的解决方案?
答案 0 :(得分:1)
我解决这个问题的方法是以一种方式实现DataSource
,以便将所有方法调用转发给真实数据源。
当我从DataSource
请求连接时,我检查这是否是第一个连接(只是一个布尔标志)。如果是,我在返回连接之前设置数据库。
伪代码:
getConnection() {
conn = delegate.getConnection()
if( firstConnection ) {
firstConnection = false;
setupDatabase( conn );
}
return conn;
}
这也使数据库设置变得懒惰。
注意:您的代码会测试许多您不应该使用的内容:Hibernate,JDBC,数据库驱动程序和数据库。通常,您应该假设这些部分可以工作或由其他人测试。
对于大多数测试,它应该足够mock the GenericDAO
。