Junit 4.x + Hibernate 5.x с базой данных H2 - PullRequest
0 голосов
/ 05 октября 2018

Я не использую какой-либо фреймворк, просто использую модуль maven war и хочу протестировать слой DAO, используя Juit 4 + Powermockito (впервые).

Моя идея - когда я вызываю CustomerDao для тестирования createCustomer.Первое утверждение этого метода следующее:

Session session = HibernateManager.getInstance().getSessionFactory().openSession();

Я хочу смоделировать этот вызов, чтобы я мог предоставить объект сеанса, который я построил в тестовом классе, используя следующий код:

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.modules.junit4.PowerMockRunner;
import com.dao.CustomerDao;

@RunWith(PowerMockRunner.class)

public class CustomerDaoTest {

    private SessionFactory sessionFactory;

    @Mock
    CustomerDao customer=new CustomerDao();

    @Before
    public void setup() {
        sessionFactory = createSessionFactory();
        }

    @Test
    public void CustomerCreateAndDeleteTest() throws Exception {
        // Want to mock here
        int id=customer.createCustomer("Indian Customer", "India", "xyz@pk.com", 
        "234567890", "AB");
        Assert.assertEquals(1, id);
     }

    private SessionFactory createSessionFactory() {
        Configuration configuration = new Configuration().configure("hibernate.cfg.h2.xml");// Using H2 for testing only
        sessionFactory = configuration.buildSessionFactory();
        return sessionFactory;
    }

}

Проблема:

  1. Когда я запускаю свой тестовый класс, я получаю сообщение об ошибке:

org.hibernate.internal.util.config.ConfigurationException: Unableвыполнить демаршаллинг в строке номер -1 и столбце -1 в RESOURCE hibernate.cfg.h2.xml.Сообщение: неожиданный элемент (uri: "http://www.hibernate.org/xsd/orm/cfg", local:" hibernate-configuration "). Ожидаемые элементы: <{} hibernate-configuration>

Но если я удалю аннотацию @RunWith(PowerMockRunner.class)тогда я не получаю эту ошибку.

Как я могу издеваться над вызовом метода, который находится внутри метода createCustomer (), как показано ниже: Session session = HibernateManager.getInstance().getSessionFactory().openSession();

Пожалуйста, объясните мне, как я могу написать блок юнит-теста для тестирования слоя DAO, который можетиспользуйте другой файл hibernate.cfg.xml.

1 Ответ

0 голосов
/ 25 апреля 2019

Похоже, проблема в загрузчике классов PowerMocks.

Невозможно проанализировать hibernate.cfg.xml

Я получил PowerMock, JUnit4 и Hibernate для работы в JDK11 послетот же принципал и добавив в мой класс следующее:

@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.hibernate.*"})

Полный пример класса:
org.hibernate hibernate-core 5.4.2.Final (compile)
junit junit:4.12 (test)
net.bytebuddy byte-buddy 1.9.10 (compile)
org.powermock powermock-module-junit4 2.0.2 (test)
com.h2database h2 1.4.199 (test)

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.hibernate.*"})
public class PowerMockHibernateTest {

    private SessionFactory sessionFactory;

    public PowerMockHibernateTest() {
    }

    @Before
    public void setUp() {
        sessionFactory = createSessionFactory();
    }

    @After
    public void tearDown() {
        sessionFactory.close();
    }

    private Session getNewSession() {
        return sessionFactory.openSession();
    }

    @Test
    public void getQuery() {
        Session session = getNewSession();
        session.createNamedQuery("PostEntity.All", PostEntity.class);
    }

    private SessionFactory createSessionFactory() {
        Configuration configuration = new Configuration().configure("hibernate.cfg.h2.xml");
        configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        configuration.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
        configuration.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");
        configuration.setProperty("hibernate.hbm2ddl.auto", "update");
        return configuration.buildSessionFactory();
    }
}
...