package org.wamblee.support.persistence; import javax.sql.DataSource; import org.dbunit.IDatabaseTester; /** * This class is the entry point for JPA tests. Test code should construct a JpaTester in the * @Before method and call {@link #start()} on it in that method. Also, test code should * call {@link #stop()} on it in the @After method. * * This class is constructed with a description of the persistence unit to be tested. The principle is that * an existing persistence.xml can be tested without change in unit test code. * * It then takes care of the following: * * * The main entry point for all this functionality is the {@link PersistenceUnitDescription} which describes the * persistence unit and must be provided at construction of the JpaTester * * NOTE: Persistence XML files should be explicitly configured with the classes that are part of the persistence unit * since scanning of classes does not work correctly in a unit test environment. This is currently the only limitation. */ public class JpaTester { private PersistenceUnitDescription persistenceUnit; private Database db; private DataSource dataSource; private DatabaseUtils dbUtils; private JpaBuilder jpaBuilder; private IDatabaseTester dbTester; /** * Constructs the tester. * @param aPersistenceUnit Persistence unit under test. */ public JpaTester(PersistenceUnitDescription aPersistenceUnit) { persistenceUnit = aPersistenceUnit; } /** * Starts the tester. This must be called prior to running the test. * @throws Exception */ public void start() throws Exception { db = DatabaseBuilder.getDatabase(); dataSource = db.start(); dbUtils = new DatabaseUtils(dataSource, persistenceUnit.getTables()); dbUtils.dropTables(); dbUtils.dropTables(JpaCustomizerBuilder.getCustomizer().getJpaTables()); jpaBuilder = new JpaBuilder(dataSource, persistenceUnit); jpaBuilder.start(); // db tester should be created after Jpa builder because jpa builder // creates the // tables that the tester looks at when it is initialized. dbTester = dbUtils.createDbTester(); } /** * Stops the tester. This must be called after the test. */ public void stop() { if (jpaBuilder != null) { jpaBuilder.stop(); } if (db != null) { db.stop(); } } public Database getDb() { return db; } public DataSource getDataSource() { return dataSource; } public IDatabaseTester getDbTester() { return dbTester; } public DatabaseUtils getDbUtils() { return dbUtils; } public JpaBuilder getJpaBuilder() { return jpaBuilder; } public PersistenceUnitDescription getPersistenceUnit() { return persistenceUnit; } }