在我的应用程序中,我需要对设备数据库进行高级搜索,所以我在服务界面中创建了这个功能:
public List<Equipement> findByCriterias(SearchEquipement searchEquipement) ;
我认为实现此功能的最佳方法是,因为我正在使用Spring MVC和Hibernate,为我的DAO接口添加一个函数:
public List<Equipement> getByCriteria(org.hibernate.Criteria criteria) ;
为了完成任务,findByCriterias
方法需要将searchEquipement
转换为org.hibernate.Criteria
,所以我决定创建一个util类来执行此操作(尚未完成):
public class ApplicationUtil {
private ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("mmapp/util/application-context-util.xml") ;
private SessionFactory sessionFactory ;
public void setSessionFactory(){
sessionFactory = (SessionFactory) context.getBean("sessionFactory") ;
}
public synchronized Criteria changeSearchEquipementToCriteria(SearchEquipementsearchEquipement) {
setSessionFactory() ;
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Equipement.class) ;
return criteria ;
}
}
问题是当我试图对这部分进行单元测试时,我遇到了很多麻烦。
public class ApplicationUtilUnitTests {
@Test
public void testChangeSearchEquipementToCriteria(){
ApplicationUtil util = new ApplicationUtil() ;
Criteria criteria = util.changeSearchEquipementToCriteria(null) ;
assertNotNull(criteria) ;
}
}
经过其他几次尝试之后,现在我收到了这个错误:
org.hibernate.HibernateException: No Session found for current thread
答案 0 :(得分:0)
我相信你的答案在于this post。您正在将集成测试与单元测试混合使用。根据您的要求,您可以做的是:
SessionFactory
,Session
和Criteria
(例如this post)答案 1 :(得分:0)
试试这个......
package com.om39a.spring.training.bean;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
@RunWith(PowerMockRunner.class)
@PrepareForTest(ApplicationUtil.class)
public class ApplicationUtilTest {
private ApplicationUtil applicationUtil;
@Mock
SessionFactory mockSessionFactory;
@Mock
Session mockSession;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
applicationUtil = PowerMockito.spy(new ApplicationUtil());
}
@Test
public void testApplicationUtil() throws Exception {
Whitebox.setInternalState("sessionFactory", mockSession);
PowerMockito.doNothing().when(applicationUtil, "setSessionFactory");
Mockito.when(mockSessionFactory.getCurrentSession()).thenReturn(
mockSession);
applicationUtil.changeSearchEquipementToCriteria(null);
/* ...
* ...
* ...
* Assert statments goes here
* ...
* ...
* ...
*/
}
}