Код модульного теста, использующий неправильную единицу сохраняемости - PullRequest
1 голос
/ 02 апреля 2012

В процессе обучения Maven создал простой проект JPA (Java Persistence 1.0.2 с реализацией EclipseLink 2.0.2).Это среда, управляемая приложениями.Поэтому я вручную контролирую жизненный цикл EntityManager.

Файл persistence.xml, используемый основным исходным кодом, отличается от того, который использует код модульного теста (также предлагается здесь ).Основной код использует базу данных Oracle, а тестовый код использует дерби в памяти.Запуск модульных тестов обновлял базу данных Oracle (!), И мне в конце концов удалось это исправить, используя два разных модуля персистентности в файлах XML.

Однако я не понимаю, почему это решило проблему.Я вручную создаю и закрываю менеджеры сущностей, и они не работают одновременно.Я почти уверен, что Maven (или способ, которым я его настроил) не испортит ресурсы (файлы XML).Фактически, глядя на выходные данные отладки Maven, я вижу, что он использует правильный файл XML для модульных тестов.На самом деле я не понимаю, почему это должно быть проблемой с самого начала.

Может ли кто-нибудь просветить меня, пожалуйста?

- Обновлено

Вот src /main / resources / META-INF / Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="MainPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>org.domain.Book</class>
        <class>org.domain.Tag</class>
        <properties>
            <property name="eclipselink.target-database" value="Oracle" />
            <property name="eclipselink.logging.level" value="INFO" />
            <property name="javax.persistence.jdbc.driver"     value="oracle.jdbc.OracleDriver" />
        <property name="javax.persistence.jdbc.url"     value="jdbc:oracle:thin:@xxx:1526:XE" />
            <property name="javax.persistence.jdbc.user" value="usr" />
            <property name="javax.persistence.jdbc.password" value="pass" />
        </properties>
    </persistence-unit>
</persistence>

, а вот src / test / resources / META-INF / Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="TestPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>org.domain.Book</class>
        <class>org.domain.Tag</class>
        <properties>
            <property name="eclipselink.target-database" value="DERBY" />
            <property name="eclipselink.ddl-generation" value="drop-and-create-    tables" />
            <property name="eclipselink.logging.level" value="FINE" />
            <property name="javax.persistence.jdbc.driver"     value="org.apache.derby.jdbc.EmbeddedDriver" />
            <property name="javax.persistence.jdbc.url"     value="jdbc:derby:memory:testDB;create=true" />
            <property name="javax.persistence.jdbc.user" value="usr" />
            <property name="javax.persistence.jdbc.password" value="pass" />
        </properties>
    </persistence-unit>
</persistence>

Основной источникcode:

....
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MainPU");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();

tx.begin();
Iterator<Book> booksItr = books.iterator();
while (booksItr.hasNext())
    em.persist(booksItr.next());
tx.commit();

em.close();
emf.close();
...

и исходный код модульного теста практически одинаков за исключением того, что для создания EntityManagerFactory используется «TestPU».

1 Ответ

0 голосов
/ 14 февраля 2018

Если у вас 2 разные базы данных, вам нужны 2 разных файла persistence.xml. В вашем тестовом файле persistence.xml, когда у вас есть один тестовый класс, вам нужен только один блок персистентности. Когда вы напишете второй тестовый класс, который тестирует бизнес-правила, обращающиеся к вашей базе данных Derby в памяти, вам понадобится еще persistence-unit в вашем тесте persistence.xml. Я думаю, что причина, по которой ваш тестовый код обращается к БД Oracle, заключается в том, что у вас есть единица персистентности БД Oracle, определенная в вашем файле test / persistence.xml. Вы должны удалить его, и у вас должна быть только эта единица сохранения для БД дерби в памяти.

...