package com.tddinaction.data.hibernate;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import junit.framework.JUnit4TestAdapter;
import org.hibernate.*;
import org.hibernate.classic.Session;
import org.junit.*;
import com.tddinaction.data.person.Person;
public class HibernatePersonDaoTest {
private SessionFactory factory;
private Session session;
private Query query;
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(HibernatePersonDaoTest.class);
}
@Before
public void setUp() {
factory = createMock(SessionFactory.class);
session = createMock(Session.class);
query = createMock(Query.class);
}
@Test
public void testFindByLastname() throws Exception {
String hql = "from Person p where p.lastname = :lastname";
String lastname = "Smith";
List<Person> theSmiths = new ArrayList<Person>();
theSmiths.add(new Person("Alice", lastname));
theSmiths.add(new Person("Billy", lastname));
theSmiths.add(new Person("Clark", lastname));
expect(factory.getCurrentSession()).andReturn(session);
expect(session.createQuery(hql)).andReturn(query);
expect(query.setParameter("lastname", lastname)).andReturn(
query);
expect(query.list()).andReturn(theSmiths);
replay(factory, session, query);
HibernatePersonDao dao = new HibernatePersonDao();
dao.setSessionFactory(factory);
assertEquals(theSmiths, dao.findByLastname(lastname));
verify(factory, session, query);
}
@Test
public void testFindByLastnameThrowsRuntimeExceptionUponFailure()
throws Exception {
String hql = "from Person p where p.lastname = :lastname";
String name = "Smith";
HibernateException hibernateError = new HibernateException("");
expect(factory.getCurrentSession()).andReturn(session);
expect(session.createQuery(hql)).andReturn(query);
expect(query.setParameter("lastname", name)).andReturn(
query);
expect(query.list()).andThrow(hibernateError);
replay(factory, session, query);
HibernatePersonDao dao = new HibernatePersonDao();
dao.setSessionFactory(factory);
try {
dao.findByLastname(name);
fail("should've thrown an exception");
} catch (RuntimeException expected) {
assertSame(hibernateError, expected.getCause());
}
verify(factory, session, query);
}
}