It is essential to software development, that bugs or misconfiguration are detected as early as possible. Therefore, tests being run during the build process can help to detect problems before your software is applied in a productive environment. In a EJB 3.0 application you may validate your DB-Schema and your named queries in a unit test, by starting up the EntityManagerFactory
. It is one of the fine new features of JPA 1.0 (related to CMP in EJB 2.x) that you are able to use it without a container in a normal Java application. For your test you need a jndi.properties
in your classpath:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost
In addition a persistence.xml
containing references to all entity classes has to be placed in META-INF
:
<?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_1_0.xsd" version="1.0"> <persistence-unit name="MYAPP_DB"> <class>mycompany.products</class> <class>mycompany.clients</class> <!-- more class mappings --> <properties> <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:myapp-db-test" /> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" /> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> </properties> </persistence-unit> </persistence>
The class definitions have to be placed in the persistence configuration, if you use maven for example, since the entity auto-detection considers the class path entry being host by the persistence unit, only. In a Maven build (life cycle phase integration-test), this is target/test-classes
. The entities generally are not situated in the test-classes folder.
Last but not least a test class which starts up the entity manager is given in the next listing:
public class MappingTest { @Test public void testMapping() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("MYAPP_DB"); assertNotNull(factory); } }
All these files are by convention situated in src/test/java
and src/test/resources
. Your pom.xml
should contain the dependency to the used testing framework (like jUnit or TestNG), the hibernate entity-manager, hibernate annotations and hsqldb. For dependencies which are necessary only for the test (like hsqldb) the scope should be set to test in order not to pollute your dependency tree with unnecessary artifacts.