The final part of the spring jigsaw is unit testing. Actually this should be the first part, but I felt it was important to see the end result before focusing on how to test the application.
Set up
<!-- TESTING DEPENDENCIES --> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.0</version> </dependency>
Example Class
public class ParkrunDAOTest { private ParkrunDAOImpl parkrunDAOImpl; private SessionFactory sessionFactory; private Session session; private Query query; @Before public void setUp() { parkrunDAOImpl = new ParkrunDAOImpl(); sessionFactory = mock(SessionFactory.class); session = mock(Session.class); query = mock(Query.class); ReflectionTestUtils.setField(parkrunDAOImpl, "sessionFactory", sessionFactory); } @Test public void addPRCourse() { PRRegion prRegion = new PRRegion(); prRegion.setId(1); prRegion.setPrName("TestRegion"); PRCourse prCourse = new PRCourse(); prCourse.setId(1); prCourse.setPrName("Test"); prCourse.setAverageTime(1200); prCourse.setUrl("http://test"); prCourse.setPrregion(prRegion); when(sessionFactory.getCurrentSession()).thenReturn(session); // call the method we wish to test... parkrunDAOImpl.addPRCourse(prCourse); // verify the method was called... verify(sessionFactory.getCurrentSession()).save(prCourse); // because there's no state to examine, we're done } @Test public void getPRCourse() { PRRegion prRegion = new PRRegion(); prRegion.setId(1); prRegion.setPrName("TestRegion"); PRCourse prCourse = new PRCourse(); prCourse.setId(1); prCourse.setPrName("Test"); prCourse.setAverageTime(1200); prCourse.setUrl("http://test"); prCourse.setPrregion(prRegion); when(sessionFactory.getCurrentSession()).thenReturn(session); when(sessionFactory.getCurrentSession().get(PRCourse.class, 1)).thenReturn(prCourse); PRCourse fromDAO = parkrunDAOImpl.getPRCourse(1); // THEN assertNotNull(fromDAO); assertSame(fromDAO, prCourse); } }
Key Points
The key point with mockito is that we are creating mock objects to allow us to test specific functionality.