package br.com.arsmachina.dao.hibernate; import java.util.ArrayList; import java.util.List; import org.easymock.EasyMock; import org.hibernate.LazyInitializationException; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.classic.Session; import org.hibernate.context.ManagedSessionContext; import org.hibernate.metadata.ClassMetadata; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import br.com.arsmachina.dao.DAO; /** * Test class for {@link GenericDAOImpl}. * * @author Thiago H. de Paula Figueiredo */ public class ConcreteDAOImplTest { final static DummyClass OBJECT = new DummyClass(); final static Integer ID = 1; private Session session; private SessionFactory sessionFactory; private ConcreteDAOImpl<DummyClass, Integer> dao; private ConcreteDAOImpl<DummyClass, Integer> realDAO; private SessionFactory realSessionFactory; @SuppressWarnings("unused") @BeforeClass private void beforeClass() { AnnotationConfiguration configuration = new AnnotationConfiguration(); configuration.configure(); configuration.setProperty("hibernate.current_session_context_class", "managed"); realSessionFactory = configuration.buildSessionFactory(); ManagedSessionContext.bind(realSessionFactory.openSession()); realDAO = new ConcreteDAOImpl<DummyClass, Integer>(DummyClass.class, realSessionFactory); } @SuppressWarnings( { "unused", "unchecked" }) @BeforeMethod private void setUp() { sessionFactory = EasyMock.createMock(org.hibernate.SessionFactory.class); session = EasyMock.createMock(Session.class); EasyMock.expect(sessionFactory.getCurrentSession()).andReturn(session).anyTimes(); ClassMetadata classMetadata = EasyMock.createMock(ClassMetadata.class); EasyMock.expect(sessionFactory.getClassMetadata(DummyClass.class)) .andReturn(classMetadata) .anyTimes(); EasyMock.expect(classMetadata.getIdentifierPropertyName()).andReturn("id").anyTimes(); EasyMock.replay(sessionFactory); EasyMock.replay(classMetadata); dao = new ConcreteDAOImpl<DummyClass, Integer>(DummyClass.class, sessionFactory); } /** * Tests {@link ConcreteDAOImpl#ConcreteDAOImpl(DAO)}. */ @SuppressWarnings("unchecked") @Test public void constructor() { boolean ok = false; try { new ConcreteDAOImpl(null, sessionFactory); } catch (IllegalArgumentException e) { ok = true; } assert ok; try { new ConcreteDAOImpl(DummyClass.class, null); } catch (IllegalArgumentException e) { ok = true; } assert ok; new ConcreteDAOImpl(DummyClass.class, sessionFactory); } /** * Tests {@link ConcreteDAOImpl#save(Object)}. */ @Test public void save() { EasyMock.expect(session.save(OBJECT)).andReturn(ID); EasyMock.replay(session); dao.save(OBJECT); EasyMock.verify(session); } /** * Tests {@link ConcreteDAOImpl#isPersistent(Object)}. */ @Test public void isPersistent() { DummyClass dummy = new DummyClass(); dummy.setId(null); assert realDAO.isPersistent(dummy) == false; dummy.setId(Integer.valueOf(1)); assert realDAO.isPersistent(dummy); } @Test public void reattach() { boolean ok = false; DummyClass dummy = createAndInsertDummyObject(); // force loading of lazy collection realDAO.evict(dummy); dummy = realDAO.findById(dummy.getId()); realDAO.evict(dummy); try { final List<Integer> elements = dummy.getElements(); for (Integer integer : elements) { integer.toString(); } } catch (LazyInitializationException e) { ok = true; } assert ok; final DummyClass reattached = realDAO.reattach(dummy); assert dummy == reattached; // force loading of lazy collection final List<Integer> elements = dummy.getElements(); for (Integer integer : elements) { integer.toString(); } } /** * Tests {@link ConcreteDAOImpl#update(Object)} with a real {@link SessionFactory}. */ @Test public void update() { final String SECOND_STRING = "aaaa"; DummyClass dummy = createAndInsertDummyObject(); dummy.setString(SECOND_STRING); session.beginTransaction(); DummyClass returned = realDAO.update(dummy); session.getTransaction().commit(); assert dummy == returned; realDAO.evict(dummy); DummyClass secondDummy = realDAO.findById(dummy.getId()); assert dummy != secondDummy; assert SECOND_STRING.equals(secondDummy.getString()); boolean ok = false; DummyClass notPersistent = new DummyClass(); try { realDAO.update(notPersistent); } catch (IllegalArgumentException e) { ok = true; } assert ok; try { realDAO.update(null); } catch (IllegalArgumentException e) { ok = true; } assert ok; } /** * @param FIRST_STRING * @return */ private DummyClass createAndInsertDummyObject() { final String FIRST_STRING = "bbbb"; List<Integer> elements = new ArrayList<Integer>(); elements.add(1); elements.add(2); DummyClass dummy = new DummyClass(); dummy.setElements(elements); dummy.setString(FIRST_STRING); session = realDAO.getSession(); session.beginTransaction(); realDAO.save(dummy); session.getTransaction().commit(); return dummy; } /** * Tests {@link ConcreteDAOImpl#delete(<T>))}. */ @Test public void delete() { session.delete((Object) OBJECT); EasyMock.replay(session); dao.delete(OBJECT); EasyMock.verify(session); } /** * Tests {@link ConcreteDAOImpl#evict(<T>))}. */ @Test public void evict() { session.evict(OBJECT); EasyMock.replay(session); dao.evict(OBJECT); EasyMock.verify(session); } /** * Tests {@link ConcreteDAOImpl#refresh(<T>))}. */ @Test public void refresh() { session.refresh(OBJECT); EasyMock.replay(session); dao.refresh(OBJECT); EasyMock.verify(session); } /** * Tests {@link ConcreteDAOImpl#getEntityClass()}. */ @Test public void getEntityClass() { assert DummyClass.class == realDAO.getEntityClass(); } /** * Tests {@link ConcreteDAOImpl#getClassMetadata())}. */ @Test public void getClassMetadata() { assert realDAO.getClassMetadata() != null; } /** * Tests {@link ConcreteDAOImpl#getPrimaryKeyPropertyName())}. */ @Test public void getPrimaryKeyPropertyName() { assert realDAO.getPrimaryKeyPropertyName().equals("id"); } /** * Tests {@link ConcreteDAOImpl#getSessionFactory())}. */ @Test public void getSessionFactory() { assert sessionFactory == dao.getSessionFactory(); } /** * Tests {@link ConcreteDAOImpl#getSession())}. */ @Test public void getSession() { EasyMock.verify(sessionFactory); } }