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 GenericDAOImplTest { final static String OBJECT = "persistent"; final static Integer ID = 1; private Session session; private SessionFactory sessionFactory; private GenericDAOImpl<String, Integer> dao; private SessionFactory realSessionFactory; private DummyDAO dummyDAO; @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()); dummyDAO = new DummyDAO(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(String.class)) .andReturn(classMetadata) .anyTimes(); EasyMock.expect(classMetadata.getIdentifierPropertyName()).andReturn("id").anyTimes(); EasyMock.replay(sessionFactory); EasyMock.replay(classMetadata); dao = new StringDAO(sessionFactory); } /** * Tests {@link GenericDAOImpl#GenericDAOImpl(DAO)}. */ @Test public void constructor() { boolean ok = false; try { new StringDAO(null); } catch (IllegalArgumentException e) { ok = true; } assert ok; new StringDAO(sessionFactory); } @Test public void testReadableDAOImplAlone() { DummyReadableDAO dao = new DummyReadableDAO(realSessionFactory); assert dao.getEntityClass() == DummyClass.class; } /** * Tests {@link GenericDAOImpl#save(Object)}. */ @Test public void save() { EasyMock.expect(session.save(OBJECT)).andReturn(ID); EasyMock.replay(session); dao.save(OBJECT); EasyMock.verify(session); } /** * Tests {@link GenericDAOImpl#isPersistent(Object)}. */ @Test public void isPersistent() { DummyDAO dummyDAO = new DummyDAO(realSessionFactory); DummyClass dummy = new DummyClass(); dummy.setId(null); assert dummyDAO.isPersistent(dummy) == false; dummy.setId(Integer.valueOf(1)); assert dummyDAO.isPersistent(dummy); } @Test public void reattach() { boolean ok = false; DummyClass dummy = createAndInsertDummyObject(); // force loading of lazy collection dummyDAO.evict(dummy); dummy = dummyDAO.findById(dummy.getId()); dummyDAO.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 = dummyDAO.reattach(dummy); assert dummy == reattached; // force loading of lazy collection final List<Integer> elements = dummy.getElements(); for (Integer integer : elements) { integer.toString(); } } /** * Tests {@link GenericDAOImpl#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 = dummyDAO.update(dummy); session.getTransaction().commit(); assert dummy == returned; dummyDAO.evict(dummy); DummyClass secondDummy = dummyDAO.findById(dummy.getId()); assert dummy != secondDummy; assert SECOND_STRING.equals(secondDummy.getString()); boolean ok = false; DummyClass notPersistent = new DummyClass(); try { dummyDAO.update(notPersistent); } catch (IllegalArgumentException e) { ok = true; } assert ok; try { dummyDAO.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 = dummyDAO.getSession(); session.beginTransaction(); dummyDAO.save(dummy); session.getTransaction().commit(); return dummy; } /** * Tests {@link GenericDAOImpl#delete(<T>))}. */ @Test public void delete() { session.delete((Object) OBJECT); EasyMock.replay(session); dao.delete(OBJECT); EasyMock.verify(session); } /** * Tests {@link GenericDAOImpl#evict(<T>))}. */ @Test public void evict() { session.evict(OBJECT); EasyMock.replay(session); dao.evict(OBJECT); EasyMock.verify(session); } /** * Tests {@link GenericDAOImpl#refresh(<T>))}. */ @Test public void refresh() { session.refresh(OBJECT); EasyMock.replay(session); dao.refresh(OBJECT); EasyMock.verify(session); } /** * Tests {@link GenericDAOImpl#getEntityClass()}. */ @Test public void getEntityClass() { assert String.class == dao.getEntityClass(); } /** * Tests {@link GenericDAOImpl#getClassMetadata())}. */ @Test public void getClassMetadata() { assert dummyDAO.getClassMetadata() != null; } /** * Tests {@link GenericDAOImpl#getPrimaryKeyPropertyName())}. */ @Test public void getPrimaryKeyPropertyName() { assert dummyDAO.getPrimaryKeyPropertyName().equals("id"); } /** * Tests {@link GenericDAOImpl#getSessionFactory())}. */ @Test public void getSessionFactory() { assert sessionFactory == dao.getSessionFactory(); } /** * Tests {@link GenericDAOImpl#getSession())}. */ @Test public void getSession() { EasyMock.verify(sessionFactory); } final private static class StringDAO extends GenericDAOImpl<String, Integer> { /** * @param dao */ @SuppressWarnings("unchecked") public StringDAO(SessionFactory sessionFactory) { super(sessionFactory); } } final private static class DummyDAO extends GenericDAOImpl<DummyClass, Integer> { /** * @param dao */ @SuppressWarnings("unchecked") public DummyDAO(SessionFactory sessionFactory) { super(sessionFactory); } } final private static class DummyReadableDAO extends ReadableDAOImpl<DummyClass, Integer> { /** * @param sessionFactory */ public DummyReadableDAO(SessionFactory sessionFactory) { super(sessionFactory); } } }