创建和单元测试Util类

时间:2012-06-12 11:14:25

标签: spring hibernate unit-testing

在我的应用程序中,我需要对设备数据库进行高级搜索,所以我在服务界面中创建了这个功能:

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

2 个答案:

答案 0 :(得分:0)

我相信你的答案在于this post。您正在将集成测试单元测试混合使用。根据您的要求,您可以做的是:

  • 使用模拟API,如Mockito,PowerMock,EasyMock或任何适合您的模式
  • 模拟Hibernate的基本功能,例如SessionFactorySessionCriteria(例如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 
         * ...
         * ...
         * ...
         */
    }
}