【问题标题】:Create and Unit test an Util class创建一个 Util 类并对其进行单元测试
【发布时间】:2012-06-12 11:14:25
【问题描述】:

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

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

【问题讨论】:

    标签: spring hibernate unit-testing


    【解决方案1】:

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

    • 使用 Mockito、PowerMock、EasyMock 等模拟 API 或任何适合您的 API
    • 模拟 Hibernate 的基本功能,例如 SessionFactorySessionCriteria(例如 this post
    • 现在,您可以执行单元测试来验证您的方法是否正常工作

    【讨论】:

      【解决方案2】:

      试试这个...

      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 
               * ...
               * ...
               * ...
               */
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2021-11-24
        • 1970-01-01
        • 2020-04-07
        • 2016-07-29
        • 1970-01-01
        相关资源
        最近更新 更多