0

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

public List<Equipement> findByCriterias(SearchEquipement searchEquipement) ;

我认为实现这个功能的最好方法是,因为我正在使用 Spring MVC 和 Hibernate,所以在我的 DAO 接口中添加一个函数:

public List<Equipement> getByCriteria(org.hibernate.Criteria criteria) ;

为了完成她的任务,该findByCriterias方法需要将 转换searchEquipement为 a 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

4

2 回答 2

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 
         * ...
         * ...
         * ...
         */
    }
}
于 2012-06-19T01:04:44.990 回答
0

我相信你的答案就在这篇文章中。您正在将集成测试单元测试混合使用。根据您的要求,您可以做的是:

  • 使用 Mockito、PowerMock、EasyMock 等模拟 API 或任何适合您的 API
  • 模拟 Hibernate 的基本功能,例如SessionFactorySessionCriteria(例如这篇文章
  • 现在,您可以执行单元测试来验证您的方法是否正常工作
于 2012-06-12T14:16:35.023 回答