Попытка модульного тестирования класса, который выполняет запросы к БД с помощью Hibernate и не может создать сессию - PullRequest
2 голосов
/ 24 апреля 2010

Я пытаюсь реализовать тесты JUnit для класса, который выполняет запросы к БД с использованием Hibernate. Когда я создаю тестируемый класс, я получаю доступ к сеансу через фабрику, выполняя следующие действия:

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

Это прекрасно работает, когда я разверну это в JBoss 5.1. Я пытаюсь понять, как заставить это работать с моим тестом JUnit. Я продолжаю получать исключение, заявляющее, что мне «нужно указать имя класса в среде или системном свойстве, или в качестве параметра апплета, или в файле ресурсов приложения: java.naming.factory.initial». Я искал высоко и низко, но не смог найти никакой информации о том, что конкретно мне нужно сделать, чтобы заставить это работать. Я не использую Spring или какие-либо фреймворки, просто старый Java и JUnit.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2010

В контексте модульного тестирования вы, скорее всего, не хотите получать фабрику сессий от JNDI (вы не хотите запускать JBoss для модульных тестов), и я рекомендую использовать старый добрый HibernateUtil класс помощника . Ниже приведен очень простой пример:

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 (собственная версия) имеет более продвинутую версию, которая может получить глобальную SessionFactory либо из статической переменной, либо из поиска JNDI (так что вы можете использовать тот же код внутри и снаружи контейнера).

Лично я долгое время использовал тот, который от Кэмерона МакКензи.

Затем получите Session из SessionFactory и начните / подтвердите / откатите транзакцию для каждого метода в модульном тесте.

0 голосов
/ 24 апреля 2010
...