vendredi 24 juillet 2015

unit testing: jpa, hibernate - how to handle entity managers?

I have a test class for a programme that uses jpa/hibernate, the dao pattern, controller classes and a gui - the usual.

I have written a persistence.xml that contains persistence-units for both the main and the test classes:

<persistence xmlns="http://ift.tt/UICAJV"
    xmlns:xsi="http://ift.tt/ra1lAU"
    xsi:schemaLocation="http://ift.tt/UICAJV http://java.sun.com/
xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="com.to.me.project.main"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/database" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />

            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.id.new_generator_mappings" value="true"/>
            <!-- <property name="hibernate.generate_statistics" value="true" /> -->

        </properties>
    </persistence-unit>
    <persistence-unit name="com.to.me.project.test"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:unit-testing" />
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
            <property name="javax.persistence.jdbc.user" value="sa" />
            <property name="javax.persistence.jdbc.password" value="" />

            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

Works fine in production code and when I run the test, the right persistence configuration is found and the databases are created.

My programme works like this: the controller calls a method of the DAO (such as create) and in this method, I get the entitymanager and use its methods (such as persist):

@Override
public void create(final SomeEntity object) throws DAOException {
        EntityManager em = MyPersistenceManager.getEntityManager();
        em.getTransaction().begin();
        em.persist(objekt);
        em.getTransaction().commit();
        em.close();
}

(The PersistenceManager is my own class, a wrapper around the EntityManagerfactory and so on...)

The problem: That entity manager uses the persistence-unit configs for the main-classes, i. e. the mysql database.So when I run my test and call the controller, it doesnt use the hsqldb databases I set up.

How do I test my controller logic with the configurations for the test persistence unit, i. e. the hsqldb?

Aucun commentaire:

Enregistrer un commentaire