Jee5unit makes it easy to unit test the JPA mappings of entities and their relations, complex queries, named queries.
public class MyTest extends EntityTestCase {
@Test
public void testPersistAndRead() {
// an entity manager is provided by jee5unit with this method
EntityManager em = getEntityManager();
em.getTransaction().begin()
MyEntity entity = new MyEntity();
entity.setSomeValue("toSomevalue");
MyCascadedEntity related = new MyCascadedEntity();
entity.setRelated(related);
em.persist(entity);
// this will make hibernate flush the operation down to the
// database transaction and will make mapping errors, nullable=false etc
// fields cause errors just as if we would commit the transaction
em.flush();
// if we don't clear the context before reading the entity again
// we will just get a reference to "entity" from above since it already
// is loaded and we will not cover any possible read related errors
// with our entity mappings
em.clear();
List<MyEntity> result = em.createQuery("SELECT m FROM MyEntity m").getResultList();
assertEquals(1, result.size());
// check that the cascade persist did happen
assertNotNull(result.get(0).getRelated());
// this is important since the jee5unit framework does not clear the database
// in any way between the test methods or test cases
em.getTransaction().rollback();
}
...
There is also a special test runner to use with your tests that will manage the transaction creation and rollback for you. Enable it by annotating your test case with the following Junit4 annotation:
@RunWith(TxRollbackRunner.class)
public class MyTest extends EntityTestCase {
@Test
public void testMethod() {
...
You will still have to perform flush() on the entity manager to get any write operation to be pushed to the transaction.