java - 使用 spring.Headache 使用 hibernate genericdao 模式测试 dao

标签 java unit-testing hibernate spring jakarta-ee

在我学习 Hibernate 的过程中,我遇到了一篇关于 hibernate site 的文章。我也在学习 spring,并且想做一些事情来通过让你实现自己的 session 来发现 spring 的灵 active 。是的,我不想使用 hibernateTemplate(用于实验)。我现在遇到了问题,甚至是测试类。我遵循了 hibernate 网站上的文章,尤其是“使用 hibernate 实现”部分 所以我们有通用的 dao 接口(interface):

public interface GenericDAO<T, ID extends Serializable> {

T findById(ID id, boolean lock);

List<T> findAll();

List<T> findByExample(T exampleInstance);

T makePersistent(T entity);

void makeTransient(T entity);

}

它是在一个抽象类中实现的,与网站上的相同。请从我提供的链接中引用它。我希望这篇文章不会太长

现在来我的dao的messagedao接口(interface)

package com.project.core.dao;

import com.project.core.model.MessageDetails;
import java.util.List;

public interface MessageDAO  extends GenericDAO<MessageDetails, Long>{
//Message class is on of my pojo
public List<Message> GetAllByStatus(String status);


}

它的实现是messagedaoimpl:

public class MessageDAOImpl extends GenericDAOImpl <Message, Long> implements MessageDAO {

// mySContainer is an interface which my HibernateUtils implement
  mySContainer sessionManager;

/**
 *
 */
public MessageDAOImpl(){}

/**
 *
 * @param sessionManager
 */
public MessageDAOImpl(HibernateUtils sessionManager){
this.sessionManager = sessionManager;
 }
 //........ plus other methods 
}

这是我的 HibernatUtils

public class HibernateUtils implements SessionContainer {
private final SessionFactory sessionFactory;
private Session session;

public HibernateUtils() {
    this.sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}

public HibernateUtils(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

/**
 *
 * this is the function that return a session.So i'm free to implements any type of session in here.
 */
public Session requestSession() {
//        if (session != null || session.isOpen()) {
//            return session;
//        } else {
        session = sessionFactory.openSession();

//        }
    return session;
  }
}

So in my understanding while using spring(will provide the conf), i'ld wire sessionFactory to my HiberbernateUtils and then wire its method RequestSession to the Session Property of the GenericDAOImpl (the one from the link provided).

这是我的 spring 配置 core.xml

<bean id="sessionManager" class="com.project.core.dao.hibernate.HibernateUtils">
    <constructor-arg ref="sessionFactory" />
</bean>   
<bean id="messageDao" class="com.project.core.dao.hibernate.MessageDAOImpl">
    <constructor-arg ref="sessionManager"/>

    </bean>
<bean id="genericDAOimpl" class="com.project.core.dao.GenericDAO">
    <property name="session" ref="mySession"/>
    </bean>
    <bean id="mySession" factory-bean="com.project.core.dao.SessionContainer" factory-method="requestSession"/>

现在我的测试是这样的

public class MessageDetailsDAOImplTest  extends AbstractDependencyInjectionSpringContextTests{


 HibernateUtils sessionManager = (HibernateUtils) applicationContext.getBean("sessionManager");
MessageDAO messagedao  =(MessageDAO) applicationContext.getBean("messageDao");



static Message[] message = new Message[]
{
    new Message("text",1,"test for dummies 1","1234567890","Pending",new Date()),
    new Message("text",2,"test for dummies 2","334455669990","Delivered",new Date())        
};


public MessageDAOImplTest() {
}

@Override
protected String[] getConfigLocations(){
    return new String[]{"file:src/main/resources/core.xml"};
}

  @Test
  public void testMakePersistent() {
      System.out.println("MakePersistent");
     messagedao.makePersistent(message[0]);
     Session session = sessionManager.RequestSession();
     session.beginTransaction();
     MessageDetails fromdb = ( Message) session.load(Message.class, message[0].getMessageId());
     assertEquals(fromdb.getMessageId(), message[0].getMessageId());
     assertEquals(fromdb.getDateSent(),message.getDateSent());
     assertEquals(fromdb.getGlobalStatus(),message.getGlobalStatus());
     assertEquals(fromdb.getNumberOfPages(),message.getNumberOfPages());

  }

我遇到了这个错误

exception in constructor testMakePersistent(java.lang.NullPointerException at com.project.core.dao.hibernate.MessageDAOImplTest)

使用此堆栈:位于 com.project.core.dao.hibernate.MessageDAOImplTest.(MessageDAOImplTest.java:28) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0( native 方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 junit.framework.TestSuite.createTest(TestSuite.java:61) 在 junit.framework.TestSuite.addTestMethod(TestSuite.java:283) 在junit.framework.TestSuite。(TestSuite.java:146) 在org.apache.tools.ant.taskdefs.可选.junit.JUnitTestRunner.run(JUnitTestRunner.java:481) 在org.apache.tools.ant.taskdefs.可选.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1031) 在org.apache.tools.ant.taskdefs.可选.junit.JUnitTestRunner.main(JUnitTestRunner.java:888) ))

如何真正使这个工作起作用。我知道这很麻烦,我感谢您阅读它。请给我一个解决方案。您会怎么做?谢谢

最佳答案

您好...我认为您使事情变得更加复杂。 :)

如果您使用 Spring 和 Hibernate(确实如此),您实际上不需要创建自己的 HibernateUtils 来管理 session 。如果你不使用 Spring,HibernateUtils 几乎是必需的,否则它看起来是多余的。这很乏味,它是您需要维护的一份额外代码,而且您可能无法正确执行它。顺便说一句,您的 HibernateUtils 似乎没有正确实现。

我会这样做:-

  1. 您需要创建一个 sessionFactory bean:-

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list>
            <value>// .. hbm files, omitted for brevity</value>
        </list>
    </property>
    <property name="hibernateProperties">
        // .. dialect, etc... omitted for brevity
    </property>
    </bean>
    
  2. 将此 sessionFactory 连接到您的 DAO(并且您的 DAO 中也需要一个 setter):-

    <bean id="messageDao" class="com.project.core.dao.hibernate.MessageDAOImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    
  3. 要获取 dao 中的连接,只需执行 sessionFactory.getCurrentSession() 即可。就是这样。

您可以通过将 sessionFactory 连接到测试用例中来执行相同的操作。

如果您想了解如何将 Spring 与 Hibernate 集成,这里有一些引用: http://static.springsource.org/spring/docs/2.5.x/reference/orm.html

关于java - 使用 spring.Headache 使用 hibernate genericdao 模式测试 dao,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1205820/

相关文章:

java - 当我运行代码时,它没有呈现我所期望的内容

java - 属性文件中的映射数据

java - 典型的预构建 Nagios 插件(例如 check_load)的源代码是什么?

php - 如何为图像创建 phpUnit 测试?

spring - 将 Spring Boot 1.3 迁移到 1.4、Hibernate 4 迁移到 5、Pascal 大小写问题

java - Eclipse:JRE 系统库选择 - 执行环境与备用 JRE

iphone - iOS 使用 Kiwi 测试具有属性的模拟子类

c# - 如何设计一个应用程序,使其易于使用单元测试进行测试?

hibernate - 插入前进行两次选择查询而不是一次

hibernate - 如何避免 HQL 和 Criteria 中不必要的选择和连接