java - 尝试对使用 Hibernate 进行数据库查询且无法创建 session 的类进行单元测试

标签 java hibernate orm junit jndi

我正在尝试为使用 Hibernate 执行数据库查询的类实现 JUnit 测试。当我创建被测类时,我通过执行以下操作通过工厂访问 session :

InitialContext context = new InitialContext();
sessionFactory = (SessionFactory) context.lookup(hibernateContext);

当我将它部署到 JBoss 5.1 时,它工作正常。我想弄清楚如何让它与我的 JUnit 测试一起使用。我不断收到一个异常,指出我“需要在环境或系统属性中指定类名,或作为小程序参数,或在应用程序资源文件中指定类名:java.naming.factory.initial”。我进行了高低搜索,但未能找到任何关于我具体需要做什么才能使其正常工作的信息。我没有使用 Spring 或任何框架,只使用普通的旧 Java 和 JUnit。

最佳答案

在单元测试上下文中,您很可能不想从 JNDI 获取 session 工厂(您不想启动 JBoss 进行单元测试),我的建议是使用一个很好的旧 HibernateUtil helper class .下面是一个非常基本的示例:

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

以防万一,caveat emptor示例应用程序( native 版本)有一个更高级的版本,可以从静态变量或 JNDI 查找中获取全局 SessionFactory(因此您可以在容器内外使用相同的代码)。

就我个人而言,我用过 the one来自 Cameron McKenzie 很长一段时间。

然后,从 SessionFactory 获取一个 Session 并开始/提交/回滚单元测试中每个方法的事务。

关于java - 尝试对使用 Hibernate 进行数据库查询且无法创建 session 的类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2701861/

相关文章:

java - 为什么期间不具有可比性

java - JUnit 测试之间的相同 hibernate session 导致问题

Hibernate (JPA) 级联 - 从 child 那里检索 id

python - 如何更新django中的多个对象

c# - 在 NHibernate 3.3 中使用 Fluent NHibernate

java在另一个类中编辑文本字段

java - 建议如何重写以下 Java 代码片段

Java监听端口

java - Hibernate 级联删除 ConstraintViolationException

php - 如何使用 Idiorm 和 Paris 仅通过一个查询从关联表中检索信息?