package info.ozkan.vipera.dao.doctor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import info.ozkan.vipera.business.doctor.DoctorManagerError; import info.ozkan.vipera.doctor.DoctorTestData; import info.ozkan.vipera.entities.Doctor; import info.ozkan.vipera.entities.DoctorNotificationSetting; import java.util.ArrayList; import java.util.Arrays; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.Query; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; /** * DoctorDaoImpl birim testleri * * @author Ömer Özkan * */ public class DoctorDaoImplTest { /** * Persistence */ @Mock private EntityManager em; /** * Doctor nesnesi */ private final Doctor doctor = DoctorTestData .getTestData(DoctorTestData.HOUSE); /** * Test edilen sınıfın nesnesi */ private final DoctorDaoImpl doctorDao = new DoctorDaoImpl(); /** * Test verileri */ @Before public void setUp() { MockitoAnnotations.initMocks(this); doctorDao.setEntityManager(em); doctor.setSettings(new ArrayList<DoctorNotificationSetting>()); } /** * Yönetici, hekim bilgilerini hatasız ve eksiksiz girer. Hekim veritabanına * kaydedilir. * * @throws Exception */ @Test public void addDoctorSuccessfully() throws Exception { final DoctorDaoResult result = doctorDao.add(doctor); assertTrue(result.isSuccess()); verifyPersist(); } /** * Veritabanında kayıtlı bir doktoru TCKN ile sorgulayarak elde eder * * @throws Exception */ @Test public void getDoctorTest() throws Exception { final Query query = createMockQuery(); configureQueryMethods(query); Mockito.when(query.getResultList()).thenReturn(Arrays.asList(doctor)); final DoctorDaoResult result = doctorDao.getByTckn(doctor.getTckn()); assertTrue(result.isSuccess()); assertEquals(doctor, result.getDoctor()); verifyGet(query); } /** * Veritabanında kayıtlı olmayan bir doktor sorgulanır sonuç başarısızdır * * @throws Exception */ @Test public void getDoctorNonExist() throws Exception { final Query query = createMockQuery(); configureQueryMethods(query); Mockito.when(query.getSingleResult()) .thenThrow(new NoResultException()); final DoctorDaoResult result = doctorDao.getByTckn(doctor.getTckn()); assertFalse(result.isSuccess()); assertEquals(DoctorManagerError.DOCTOR_NOT_EXIST, result.getError()); } /** * {@link DoctorDaoImpl#get(Long)} metodu için gerekli metodların * çağrıldığını doğrular * * @param query */ private void verifyGet(final Query query) { Mockito.verify(em).createQuery(DoctorDaoImpl.JQL_GET_BY_TCKN); Mockito.verify(query).setParameter(Doctor.TCKN, doctor.getTckn()); Mockito.verify(query).getResultList(); } /** * em.persist metodunun çağrıldığını doğrular */ private void verifyPersist() { Mockito.verify(em).persist(doctor); } /** * Mock nesnesi oluşturur * * @return */ private Query createMockQuery() { final Query query = Mockito.mock(Query.class); return query; } /** * Query nesnesinin metodlarını mocklar * * @param query */ private void configureQueryMethods(final Query query) { Mockito.when(em.createQuery(DoctorDaoImpl.JQL_GET_BY_TCKN)).thenReturn( query); Mockito.when(query.setParameter(Doctor.TCKN, doctor.getTckn())) .thenReturn(query); } }