0

私のアプリケーションでは、機器データベースに対して高度な検索を行う必要があるため、サービスインターフェイスで次の関数を作成しました。

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

4

2 に答える 2

0

あなたの答えはこの投稿にあると思います。Integration TestingUnit Testingを混在させています。要件の性質上、できることは次のとおりです。

  • Mockito、PowerMock、EasyMock、または自分に合ったものなどのモック API を使用する
  • SessionFactorySession、およびCriteria(例:この投稿)などの Mock Hibernate の基本機能
  • これで、単体テストを実行して、メソッドが適切に機能していることを確認できます
于 2012-06-12T14:16:35.023 に答える
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 に答える