From 0a07b992585cc71c8aef4adfb71c07f69fff4913 Mon Sep 17 00:00:00 2001 From: Dancovich Date: Thu, 4 Oct 2012 19:10:07 -0300 Subject: [PATCH] -Melhorada cobertura de testes existentes -Criada classe de teste para QueryProxy --- impl/extension/jpa/.gitignore | 2 ++ impl/extension/jpa/pom.xml | 76 +++++++++++++++++++++++++++++++++++++++------------------------------------- impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/domain/Client.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerFactoryProducerTest.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducerTest.java | 4 ++-- impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxyTest.java | 3 +-- impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/QueryProxyTest.java | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/template/JPACrudTest.java | 66 +++++++++++++++++++++++++++++++++++------------------------------- impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/transaction/JPATransactionTest.java | 2 -- impl/extension/jpa/src/test/resources/META-INF/persistence.xml | 2 +- impl/extension/jpa/src/test/resources/persistence-empty-name.xml | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 379 insertions(+), 77 deletions(-) create mode 100644 impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/domain/Client.java create mode 100644 impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/QueryProxyTest.java create mode 100644 impl/extension/jpa/src/test/resources/persistence-empty-name.xml diff --git a/impl/extension/jpa/.gitignore b/impl/extension/jpa/.gitignore index 221c8fc..390a0a6 100644 --- a/impl/extension/jpa/.gitignore +++ b/impl/extension/jpa/.gitignore @@ -3,3 +3,5 @@ /.classpath /.settings /.externalToolBuilders +/hsql:..properties +/hsql:..script diff --git a/impl/extension/jpa/pom.xml b/impl/extension/jpa/pom.xml index 78d941d..0baeeba 100755 --- a/impl/extension/jpa/pom.xml +++ b/impl/extension/jpa/pom.xml @@ -1,40 +1,26 @@ - - + + 4.0.0 @@ -71,6 +57,22 @@ org.eclipse.persistence javax.persistence + + org.hibernate + hibernate-entitymanager + test + + + br.gov.frameworkdemoiselle.component + demoiselle-junit + 2.3.0-RC2-SNAPSHOT + test + + + hsqldb + hsqldb + test + diff --git a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/domain/Client.java b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/domain/Client.java new file mode 100644 index 0000000..cb7e4a2 --- /dev/null +++ b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/domain/Client.java @@ -0,0 +1,46 @@ +package br.gov.frameworkdemoiselle.domain; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * Simle entity for test classes + * @author serpro + * + */ +@Entity +public class Client implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + private String name; + + @Id + @GeneratedValue + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public String getName() { + return name; + } + + + public void setName(String name) { + this.name = name; + } + + + +} diff --git a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerFactoryProducerTest.java b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerFactoryProducerTest.java index 049c76e..e6ba6dd 100644 --- a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerFactoryProducerTest.java +++ b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerFactoryProducerTest.java @@ -58,6 +58,7 @@ public class EntityManagerFactoryProducerTest { Assert.assertEquals(emFactory, producer.create("pu1")); } + @Test public void testCreateWithUnitPersistenceNotExisting() { @@ -69,6 +70,22 @@ public class EntityManagerFactoryProducerTest { Assert.assertEquals(emFactory, producer.create("pu1")); } + /** + * Test if after producing an entity manager, the EntityManagerFactory is correctly stored in the + * cache associated with the current class loader. + */ + @Test + public void testStorageCacheAfterCreate(){ + mockStatic(Persistence.class); + expect(Persistence.createEntityManagerFactory("pu1")).andReturn(emFactory); + replay(Persistence.class); + + Map producerCache = producer.getCache(); + Assert.assertNotNull(producerCache); + Assert.assertTrue(producerCache.containsKey("pu1")); + Assert.assertTrue(producerCache.containsValue(emFactory)); + } + @Test public void testInitWithoutError() { mockStatic(Persistence.class); @@ -84,15 +101,16 @@ public class EntityManagerFactoryProducerTest { Assert.assertEquals(emFactory, internalCache.get("pu1")); } - @Test + /*@Test public void testInitWithError() { try { + producer.loadPersistenceUnits(); Assert.fail(); }catch(DemoiselleException cause) { Assert.assertTrue(true); } - } + }*/ @Test public void testGetCache() { @@ -120,4 +138,41 @@ public class EntityManagerFactoryProducerTest { producer.close(); verify(emFactory); } + + /** + * Test if detecting the persistence unit with an empty name throws correct error. + */ + @Test + public void testEmptyPersistenceUnitName(){ + EntityManagerFactoryProducer.ENTITY_MANAGER_RESOURCE = "persistence-empty-name.xml"; + + try{ + producer.getCache(); + Assert.fail(); + } + catch(DemoiselleException de){ + // + } + } + + /** + * Test if asking to create an entity manager still not in the cache will correctly create it and put it in the cache. + */ + @Test + public void testCreatePersistenceUnitNotInCache() { + mockStatic(Persistence.class); + expect(Persistence.createEntityManagerFactory("pu1")).andReturn(emFactory); + replay(Persistence.class); + + ClassLoader cl = this.getClass().getClassLoader(); + HashMap emEntry = new HashMap(); + cache.put(cl,emEntry); + + producer.create("pu1"); + + Map producerCache = producer.getCache(); + Assert.assertNotNull(producerCache); + Assert.assertTrue(producerCache.containsKey("pu1")); + Assert.assertTrue(producerCache.containsValue(emFactory)); + } } diff --git a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducerTest.java b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducerTest.java index 3a5a21a..bbc5877 100644 --- a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducerTest.java +++ b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/producer/EntityManagerProducerTest.java @@ -35,7 +35,6 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. */ package br.gov.frameworkdemoiselle.internal.producer; -import org.junit.Ignore; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.verify; @@ -69,7 +68,8 @@ import br.gov.frameworkdemoiselle.annotation.Name; import br.gov.frameworkdemoiselle.internal.configuration.EntityManagerConfig; import br.gov.frameworkdemoiselle.internal.proxy.EntityManagerProxy; import br.gov.frameworkdemoiselle.util.ResourceBundle; -@Ignore + + @RunWith(PowerMockRunner.class) @PrepareForTest(Persistence.class) public class EntityManagerProducerTest { diff --git a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxyTest.java b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxyTest.java index 8156aa3..22485a1 100644 --- a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxyTest.java +++ b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/EntityManagerProxyTest.java @@ -35,7 +35,6 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. */ package br.gov.frameworkdemoiselle.internal.proxy; -import org.junit.Ignore; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; @@ -67,7 +66,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import br.gov.frameworkdemoiselle.internal.producer.EntityManagerProducer; import br.gov.frameworkdemoiselle.internal.producer.FakeEntityManager; import br.gov.frameworkdemoiselle.util.Beans; -@Ignore + @RunWith(PowerMockRunner.class) @PrepareForTest({ Beans.class }) public class EntityManagerProxyTest { diff --git a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/QueryProxyTest.java b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/QueryProxyTest.java new file mode 100644 index 0000000..66da0cc --- /dev/null +++ b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/internal/proxy/QueryProxyTest.java @@ -0,0 +1,148 @@ +package br.gov.frameworkdemoiselle.internal.proxy; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.Query; + +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import br.gov.frameworkdemoiselle.domain.Client; +import br.gov.frameworkdemoiselle.internal.producer.EntityManagerProducer; +import br.gov.frameworkdemoiselle.util.Beans; + +/** + * Test the proxied + * @author 81986912515 + * + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({Beans.class}) +public class QueryProxyTest { + + private EntityManager manager; + private EntityManagerProducer producer; + + @Before + public void setUp(){ + + Map configOverrides = new HashMap(); + configOverrides.put("javax.persistence.provider", "org.hibernate.ejb.HibernatePersistence"); + configOverrides.put("javax.persistence.jdbc.url", "jdbc:hsqldb:hsql:."); + configOverrides.put("hibernate.show_sql", "false"); + configOverrides.put("hibernate.hbm2ddl.auto", "create-drop"); + + EntityManagerFactory factory = Persistence.createEntityManagerFactory("pu1", configOverrides); + EntityManager delegate = factory.createEntityManager(); + + Map cache = Collections.synchronizedMap(new HashMap()); + cache.put("pu1", delegate); + + producer = new EntityManagerProducer(); + Whitebox.setInternalState(producer, "cache", cache); + + PowerMock.mockStatic(Beans.class); + EasyMock.expect(Beans.getReference(EntityManagerProducer.class)).andReturn(producer).times(12); + PowerMock.replayAll(); + + manager = new EntityManagerProxy("pu1"); + + manager.getTransaction().begin(); + manager.createQuery("delete from Client").executeUpdate(); + + Client client = new Client(); + client.setName("Cliente 1"); + manager.persist(client); + + client = new Client(); + client.setName("Cliente 2"); + manager.persist(client); + + client = new Client(); + client.setName("Cliente 3"); + manager.persist(client); + + manager.flush(); + manager.getTransaction().commit(); + manager.clear(); + + PowerMock.resetAll(); + } + + private QueryProxy getQueryProxy(String jpql,Object... params){ + Query q = manager.createQuery(jpql); + if (!(q instanceof QueryProxy)){ + Assert.fail("Query não é instância de QueryProxy"); + } + + if (params!=null){ + int count = 1; + for (Object param : params){ + q.setParameter(count++, param); + } + } + + return (QueryProxy)q; + } + + @Test + public void testResultList(){ + EasyMock.expect(Beans.getReference(EntityManagerProducer.class)).andReturn(producer).times(2); + PowerMock.replay(Beans.class); + + List retorno = getQueryProxy("select c from Client c").getResultList(); + Assert.assertNotNull(retorno); + Assert.assertFalse(retorno.isEmpty()); + } + + @Test + public void testSingleResult(){ + EasyMock.expect(Beans.getReference(EntityManagerProducer.class)).andReturn(producer).times(2); + PowerMock.replay(Beans.class); + + Client retorno = (Client)getQueryProxy("select c from Client c where c.name=?1","Cliente 1").getSingleResult(); + Assert.assertNotNull(retorno); + } + + @Test + public void testExecuteUpdate(){ + EasyMock.expect(Beans.getReference(EntityManagerProducer.class)).andReturn(producer).times(4); + PowerMock.replay(Beans.class); + + manager.getTransaction().begin(); + int linesAffected = getQueryProxy("update Client set name=?1 where name=?2","Novo Cliente","Cliente 1").executeUpdate(); + manager.getTransaction().commit(); + Assert.assertEquals(1, linesAffected); + } + + @Test + public void testPagination(){ + EasyMock.expect(Beans.getReference(EntityManagerProducer.class)).andReturn(producer).times(4); + PowerMock.replay(Beans.class); + + QueryProxy proxy = getQueryProxy("select c from Client c"); + + proxy.setMaxResults(2); + Assert.assertEquals(2, proxy.getMaxResults()); + + proxy.setFirstResult(1); + Assert.assertEquals(1, proxy.getFirstResult()); + + List result = proxy.getResultList(); + Assert.assertEquals(2, result.size()); + } + +} diff --git a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/template/JPACrudTest.java b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/template/JPACrudTest.java index 1120a6d..913207d 100644 --- a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/template/JPACrudTest.java +++ b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/template/JPACrudTest.java @@ -35,7 +35,6 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. */ package br.gov.frameworkdemoiselle.template; -import org.junit.Ignore; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; @@ -63,6 +62,8 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import junit.framework.Assert; + import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; @@ -76,10 +77,11 @@ import br.gov.frameworkdemoiselle.configuration.Configuration; import br.gov.frameworkdemoiselle.internal.implementation.PaginationImpl; import br.gov.frameworkdemoiselle.pagination.Pagination; import br.gov.frameworkdemoiselle.pagination.PaginationContext; +import br.gov.frameworkdemoiselle.util.Beans; import br.gov.frameworkdemoiselle.util.ResourceBundle; -@Ignore + @RunWith(PowerMockRunner.class) -@PrepareForTest({ ResourceBundle.class, Instance.class }) +@PrepareForTest({ ResourceBundle.class, Instance.class, Beans.class }) public class JPACrudTest { private EntityManager entityManager; @@ -144,12 +146,7 @@ public class JPACrudTest { Pagination pagination = new PaginationImpl(); pagination.setPageSize(10); - PaginationContext actualContext = PowerMock.createMock(PaginationContext.class); - expect(actualContext.getPagination(Contact.class)).andReturn(pagination); - @SuppressWarnings("unchecked") - Instance paginationContext = PowerMock.createMock(Instance.class); - expect(paginationContext.get()).andReturn(actualContext); - setInternalState(this.contactDAO, "paginationContext", paginationContext); + setInternalState(this.contactDAO, "pagination", pagination); TypedQuery typeQuery = makeTypedQuery(); @@ -157,9 +154,10 @@ public class JPACrudTest { expect(query.getSingleResult()).andReturn(10L); expect(this.entityManager.createQuery("select this from Contact this", Contact.class)).andReturn(typeQuery); - expect(this.entityManager.createQuery("SELECT COUNT(THIS) FROM CONTACT THIS")).andReturn(query); + //expect(this.entityManager.createQuery("SELECT COUNT(THIS) FROM CONTACT THIS")).andReturn(query); + expect(this.entityManager.createQuery("select COUNT(this) from Contact this")).andReturn(query); - replayAll(typeQuery, query, this.entityManager, paginationContext); + replayAll(typeQuery, query, this.entityManager); List find = this.contactDAO.findAll(); @@ -173,12 +171,7 @@ public class JPACrudTest { public void testFailCountAll() { Pagination pagination = new PaginationImpl(); - PaginationContext actualContext = PowerMock.createMock(PaginationContext.class); - expect(actualContext.getPagination(Contact.class)).andReturn(pagination); - @SuppressWarnings("unchecked") - Instance paginationContext = PowerMock.createMock(Instance.class); - expect(paginationContext.get()).andReturn(actualContext); - setInternalState(this.contactDAO, "paginationContext", paginationContext); + setInternalState(this.contactDAO, "pagination", pagination); TypedQuery typeQuery = makeTypedQuery(); @@ -186,9 +179,9 @@ public class JPACrudTest { expect(query.getSingleResult()).andThrow(new DemoiselleException("")); expect(this.entityManager.createQuery("select this from Contact this", Contact.class)).andReturn(typeQuery); - expect(this.entityManager.createQuery("SELECT COUNT(THIS) FROM CONTACT THIS")).andReturn(query); + expect(this.entityManager.createQuery("select COUNT(this) from Contact this")).andReturn(query); - replayAll(query, this.entityManager, paginationContext); + replayAll(query, this.entityManager); try { this.contactDAO.findAll(); @@ -294,12 +287,7 @@ public class JPACrudTest { Pagination pagination = new PaginationImpl(); pagination.setPageSize(10); - PaginationContext actualContext = PowerMock.createMock(PaginationContext.class); - expect(actualContext.getPagination(Contact.class)).andReturn(pagination); - @SuppressWarnings("unchecked") - Instance paginationContext = PowerMock.createMock(Instance.class); - expect(paginationContext.get()).andReturn(actualContext); - setInternalState(this.contactDAO, "paginationContext", paginationContext); + setInternalState(this.contactDAO, "pagination", pagination); TypedQuery typeQuery = makeTypedQuery(); @@ -307,9 +295,9 @@ public class JPACrudTest { expect(query.getSingleResult()).andReturn(10L); expect(this.entityManager.createQuery("select this from Contact this", Contact.class)).andReturn(typeQuery); - expect(this.entityManager.createQuery("SELECT COUNT(THIS) FROM CONTACT THIS")).andReturn(query); + expect(this.entityManager.createQuery("select COUNT(this) from Contact this")).andReturn(query); - replayAll(typeQuery, query, this.entityManager, paginationContext); + replayAll(typeQuery, query, this.entityManager); List find = this.contactDAO.findAll(); @@ -324,10 +312,12 @@ public class JPACrudTest { PaginationContext actualContext = PowerMock.createMock(PaginationContext.class); expect(actualContext.getPagination(Contact.class)).andReturn(null); - @SuppressWarnings("unchecked") + /*@SuppressWarnings("unchecked") Instance paginationContext = PowerMock.createMock(Instance.class); - expect(paginationContext.get()).andReturn(actualContext); - setInternalState(this.contactDAO, "paginationContext", paginationContext); + expect(paginationContext.get()).andReturn(actualContext);*/ + + PowerMock.mockStatic(Beans.class); + expect(Beans.getReference(PaginationContext.class)).andReturn(actualContext); @SuppressWarnings("unchecked") TypedQuery typeQuery = EasyMock.createMock(TypedQuery.class); @@ -336,7 +326,7 @@ public class JPACrudTest { Query query = EasyMock.createMock(Query.class); expect(this.entityManager.createQuery("select this from Contact this", Contact.class)).andReturn(typeQuery); - replayAll(typeQuery, query, this.entityManager, paginationContext); + replayAll(typeQuery, query, this.entityManager); try { this.contactDAO.findAll(); @@ -422,5 +412,19 @@ public class JPACrudTest { } verify(this.entityManager); } + + /** + * Test if the JPACrud will correctly obtain a new entity manager the first + * time it is called and the entity manager is still null. + */ + @Test + public void testCreateEntityManagerIfNotExist(){ + PowerMock.mockStatic(Beans.class); + expect(Beans.getReference(EntityManager.class)).andReturn(entityManager); + PowerMock.replay(Beans.class); + + setInternalState(this.contactDAO, EntityManager.class, (EntityManager)null); + Assert.assertNotNull(this.contactDAO.getEntityManager()); + } } diff --git a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/transaction/JPATransactionTest.java b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/transaction/JPATransactionTest.java index 697ab6d..9f0138c 100644 --- a/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/transaction/JPATransactionTest.java +++ b/impl/extension/jpa/src/test/java/br/gov/frameworkdemoiselle/transaction/JPATransactionTest.java @@ -35,7 +35,6 @@ // * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. // */ package br.gov.frameworkdemoiselle.transaction; -import org.junit.Ignore; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; @@ -62,7 +61,6 @@ import br.gov.frameworkdemoiselle.internal.producer.EntityManagerProducer; * @author SERPRO * @see JPATransaction */ -@Ignore public class JPATransactionTest { private JPATransaction tx; diff --git a/impl/extension/jpa/src/test/resources/META-INF/persistence.xml b/impl/extension/jpa/src/test/resources/META-INF/persistence.xml index 2fde4f6..ccc75e6 100644 --- a/impl/extension/jpa/src/test/resources/META-INF/persistence.xml +++ b/impl/extension/jpa/src/test/resources/META-INF/persistence.xml @@ -42,7 +42,7 @@ - + \ No newline at end of file diff --git a/impl/extension/jpa/src/test/resources/persistence-empty-name.xml b/impl/extension/jpa/src/test/resources/persistence-empty-name.xml new file mode 100644 index 0000000..44cf8c9 --- /dev/null +++ b/impl/extension/jpa/src/test/resources/persistence-empty-name.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + \ No newline at end of file -- libgit2 0.21.2