You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@griffin.apache.org by gu...@apache.org on 2018/01/30 01:45:14 UTC

[2/5] incubator-griffin git commit: update exception handling and restful response

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java b/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
index 51edad8..0290306 100644
--- a/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
+++ b/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
@@ -19,44 +19,54 @@ under the License.
 
 package org.apache.griffin.core.job;
 
+import org.apache.griffin.core.exception.GriffinException;
+import org.apache.griffin.core.exception.GriffinExceptionHandler;
+import org.apache.griffin.core.exception.GriffinExceptionMessage;
 import org.apache.griffin.core.job.entity.*;
-import org.apache.griffin.core.util.GriffinOperationMessage;
 import org.apache.griffin.core.util.JsonUtil;
 import org.apache.griffin.core.util.URLHelper;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.springframework.http.MediaType;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
-import java.io.Serializable;
 import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.Collections;
 
-import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+import static org.apache.griffin.core.exception.GriffinExceptionMessage.JOB_ID_DOES_NOT_EXIST;
+import static org.apache.griffin.core.exception.GriffinExceptionMessage.JOB_NAME_DOES_NOT_EXIST;
+import static org.apache.griffin.core.util.EntityHelper.createGriffinJob;
+import static org.apache.griffin.core.util.EntityHelper.createJobSchedule;
 import static org.hamcrest.CoreMatchers.is;
 import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 @RunWith(SpringRunner.class)
-@WebMvcTest(value = JobController.class, secure = false)
 public class JobControllerTest {
-    @Autowired
+
     private MockMvc mvc;
 
-    @MockBean
-    private JobService service;
+    @Mock
+    private JobServiceImpl service;
+
+    @InjectMocks
+    private JobController controller;
 
     @Before
     public void setup() {
+        mvc = MockMvcBuilders
+                .standaloneSetup(controller)
+                .setControllerAdvice(new GriffinExceptionHandler())
+                .build();
     }
 
 
@@ -64,7 +74,7 @@ public class JobControllerTest {
     public void testGetJobs() throws Exception {
         JobDataBean jobBean = new JobDataBean();
         jobBean.setJobName("job_name");
-        given(service.getAliveJobs()).willReturn(Arrays.asList(jobBean));
+        given(service.getAliveJobs()).willReturn(Collections.singletonList(jobBean));
 
         mvc.perform(get(URLHelper.API_VERSION_PATH + "/jobs").contentType(MediaType.APPLICATION_JSON))
                 .andExpect(status().isOk())
@@ -73,76 +83,102 @@ public class JobControllerTest {
 
     @Test
     public void testAddJobForSuccess() throws Exception {
-        JobSchedule jobSchedule = new JobSchedule(1L, "jobName","0 0/4 * * * ?","GMT+8:00", null);
-        given(service.addJob(jobSchedule)).willReturn(CREATE_JOB_SUCCESS);
+        JobSchedule jobSchedule = createJobSchedule();
+        GriffinJob job = createGriffinJob();
+        given(service.addJob(jobSchedule)).willReturn(job);
 
         mvc.perform(post(URLHelper.API_VERSION_PATH + "/jobs")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(JsonUtil.toJson(jobSchedule)))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(205)))
-                .andDo(print());
+                .andExpect(status().isCreated())
+                .andExpect(jsonPath("$.id", is(1)));
     }
 
     @Test
-    public void testAddJobForFailure() throws Exception {
-        JobSchedule jobSchedule = new JobSchedule(1L, "jobName","0 0/4 * * * ?","GMT+8:00", null);
-        given(service.addJob(jobSchedule)).willReturn(CREATE_JOB_FAIL);
+    public void testAddJobForFailureWithBadRequest() throws Exception {
+        JobSchedule jobSchedule = createJobSchedule();
+        given(service.addJob(jobSchedule))
+                .willThrow(new GriffinException.BadRequestException(GriffinExceptionMessage.MISSING_METRIC_NAME));
 
         mvc.perform(post(URLHelper.API_VERSION_PATH + "/jobs")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(JsonUtil.toJson(jobSchedule)))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(405)))
-                .andDo(print());
+                .andExpect(status().isBadRequest());
+    }
+
+    @Test
+    public void testAddJobForFailureWithTriggerKeyExist() throws Exception {
+        JobSchedule jobSchedule = createJobSchedule();
+        given(service.addJob(jobSchedule))
+                .willThrow(new GriffinException.ConflictException(GriffinExceptionMessage.QUARTZ_JOB_ALREADY_EXIST));
+
+        mvc.perform(post(URLHelper.API_VERSION_PATH + "/jobs")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(JsonUtil.toJson(jobSchedule)))
+                .andExpect(status().isConflict());
     }
 
     @Test
     public void testDeleteJobByIdForSuccess() throws Exception {
-        given(service.deleteJob(1L)).willReturn(DELETE_JOB_SUCCESS);
+        doNothing().when(service).deleteJob(1L);
 
         mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs/1"))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(206)));
+                .andExpect(status().isNoContent());
     }
 
     @Test
-    public void testDeleteJobByIdForFailure() throws Exception {
-        given(service.deleteJob(1L)).willReturn(DELETE_JOB_FAIL);
+    public void testDeleteJobByIdForFailureWithNotFound() throws Exception {
+        doThrow(new GriffinException.NotFoundException(JOB_ID_DOES_NOT_EXIST)).when(service).deleteJob(1L);
 
         mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs/1"))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(406)));
+                .andExpect(status().isNotFound());
+    }
+
+    @Test
+    public void testDeleteJobByIdForFailureWithException() throws Exception {
+        doThrow(new GriffinException.ServiceException("Failed to delete job", new Exception()))
+                .when(service).deleteJob(1L);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs/1"))
+                .andExpect(status().isInternalServerError());
     }
 
     @Test
     public void testDeleteJobByNameForSuccess() throws Exception {
         String jobName = "jobName";
-        given(service.deleteJob(jobName)).willReturn(DELETE_JOB_SUCCESS);
+        doNothing().when(service).deleteJob(jobName);
 
-        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs").param("jobName",jobName))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(206)));
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs").param("jobName", jobName))
+                .andExpect(status().isNoContent());
     }
 
     @Test
-    public void testDeleteJobByNameForFailure() throws Exception {
+    public void testDeleteJobByNameForFailureWithNotFound() throws Exception {
         String jobName = "jobName";
-        given(service.deleteJob(jobName)).willReturn(DELETE_JOB_FAIL);
+        doThrow(new GriffinException.NotFoundException(JOB_NAME_DOES_NOT_EXIST)).when(service).deleteJob(jobName);
 
-        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs").param("jobName",jobName))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(406)));
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs").param("jobName", jobName))
+                .andExpect(status().isNotFound());
+    }
+
+    @Test
+    public void testDeleteJobByNameForFailureWithException() throws Exception {
+        String jobName = "jobName";
+        doThrow(new GriffinException.ServiceException("Failed to delete job", new Exception()))
+                .when(service).deleteJob(jobName);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs").param("jobName", jobName))
+                .andExpect(status().isInternalServerError());
     }
 
     @Test
     public void testFindInstancesOfJob() throws Exception {
         int page = 0;
         int size = 2;
-        JobInstanceBean jobInstance = new JobInstanceBean(1L,  LivySessionStates.State.running, "", "", null,null);
+        JobInstanceBean jobInstance = new JobInstanceBean(1L, LivySessionStates.State.running, "", "", null, null);
         given(service.findInstancesOfJob(1L, page, size)).willReturn(Arrays.asList(jobInstance));
 
-        mvc.perform(get(URLHelper.API_VERSION_PATH + "/jobs/instances").param("jobId",String.valueOf(1L))
+        mvc.perform(get(URLHelper.API_VERSION_PATH + "/jobs/instances").param("jobId", String.valueOf(1L))
                 .param("page", String.valueOf(page)).param("size", String.valueOf(size)))
                 .andExpect(status().isOk())
                 .andExpect(jsonPath("$.[0].state", is("running")));

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/job/JobServiceImplTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/job/JobServiceImplTest.java b/service/src/test/java/org/apache/griffin/core/job/JobServiceImplTest.java
index d529753..a5beb51 100644
--- a/service/src/test/java/org/apache/griffin/core/job/JobServiceImplTest.java
+++ b/service/src/test/java/org/apache/griffin/core/job/JobServiceImplTest.java
@@ -19,7 +19,7 @@ under the License.
 
 package org.apache.griffin.core.job;
 
-import org.apache.griffin.core.error.exception.GriffinException;
+import org.apache.griffin.core.exception.GriffinException;
 import org.apache.griffin.core.job.entity.*;
 import org.apache.griffin.core.job.repo.GriffinJobRepo;
 import org.apache.griffin.core.job.repo.JobInstanceRepo;
@@ -27,7 +27,6 @@ import org.apache.griffin.core.job.repo.JobScheduleRepo;
 import org.apache.griffin.core.measure.entity.DataConnector;
 import org.apache.griffin.core.measure.entity.GriffinMeasure;
 import org.apache.griffin.core.measure.repo.GriffinMeasureRepo;
-import org.apache.griffin.core.util.GriffinOperationMessage;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,23 +40,17 @@ import org.springframework.boot.test.context.TestConfiguration;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
+import java.util.*;
 
 import static org.apache.griffin.core.util.EntityHelper.*;
-import static org.apache.griffin.core.util.GriffinOperationMessage.*;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.*;
 
 @RunWith(SpringRunner.class)
 public class JobServiceImplTest {
@@ -108,32 +101,35 @@ public class JobServiceImplTest {
     @Test
     public void testGetAliveJobsForSuccess() throws SchedulerException {
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        GriffinJob job = new GriffinJob(1L, 1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByDeleted(false)).willReturn(Arrays.asList(job));
         SimpleTrigger trigger = new SimpleTriggerImpl();
         given((List<Trigger>) scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willReturn(Arrays.asList(trigger));
+
         assertEquals(service.getAliveJobs().size(), 1);
     }
 
     @Test
     public void testGetAliveJobsForNoJobsWithTriggerEmpty() throws SchedulerException {
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        GriffinJob job = new GriffinJob(1L, 1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByDeleted(false)).willReturn(Arrays.asList(job));
         given((List<Trigger>) scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willReturn(new ArrayList<>());
+
         assertEquals(service.getAliveJobs().size(), 0);
     }
 
-    @Test
+    @Test(expected = GriffinException.ServiceException.class)
     public void testGetAliveJobsForNoJobsWithException() throws SchedulerException {
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        GriffinJob job = new GriffinJob(1L, 1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByDeleted(false)).willReturn(Arrays.asList(job));
-        GriffinException.GetJobsFailureException exception = getExceptionForGetAliveJObs(scheduler);
-        assert exception != null;
+        given(scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willThrow(new SchedulerException());
+
+        service.getAliveJobs();
     }
 
 
@@ -142,89 +138,90 @@ public class JobServiceImplTest {
         JobSchedule js = createJobSchedule();
         js.setId(1L);
         GriffinMeasure measure = createGriffinMeasure("measureName");
-        GriffinJob job = new GriffinJob(1L, 1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         Scheduler scheduler = Mockito.mock(Scheduler.class);
         given(factory.getObject()).willReturn(scheduler);
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
         given(jobRepo.countByJobNameAndDeleted(js.getJobName(), false)).willReturn(0);
         given(jobScheduleRepo.save(js)).willReturn(js);
         given(jobRepo.save(Matchers.any(GriffinJob.class))).willReturn(job);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_SUCCESS);
+
+        GriffinJob griffinJob = service.addJob(js);
+        assertEquals(griffinJob.getJobName(), job.getJobName());
     }
 
-    @Test
+    @Test(expected = GriffinException.BadRequestException.class)
     public void testAddJobForFailureWithMeasureNull() throws Exception {
         JobSchedule js = createJobSchedule();
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(null);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
-    @Test
-    public void testAddJobForFailureWitJobNameRepeat() throws Exception {
+    @Test(expected = GriffinException.BadRequestException.class)
+    public void testAddJobForFailureWitJobNameDuplicate() throws Exception {
         JobSchedule js = createJobSchedule();
         GriffinMeasure measure = createGriffinMeasure("measureName");
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
         given(jobRepo.countByJobNameAndDeleted(js.getJobName(), false)).willReturn(1);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
-    @Test
+    @Test(expected = GriffinException.BadRequestException.class)
     public void testAddJobForFailureWitJobNameNull() throws Exception {
         JobSchedule js = createJobSchedule(null);
         GriffinMeasure measure = createGriffinMeasure("measureName");
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
-    @Test
+    @Test(expected = GriffinException.BadRequestException.class)
     public void testAddJobForFailureWithBaselineInvalid() throws Exception {
         JobDataSegment source = createJobDataSegment("source_name", false);
         JobDataSegment target = createJobDataSegment("target_name", false);
         JobSchedule js = createJobSchedule("jobName", source, target);
         GriffinMeasure measure = createGriffinMeasure("measureName");
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
-    @Test
+    @Test(expected = GriffinException.BadRequestException.class)
     public void testAddJobForFailureWithConnectorNameInvalid() throws Exception {
         GriffinMeasure measure = createGriffinMeasure("measureName");
         JobDataSegment source = createJobDataSegment("source_connector_name", true);
         JobDataSegment target = createJobDataSegment("target_name", false);
         JobSchedule js = createJobSchedule("jobName", source, target);
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
-    @Test
-    public void testAddJobForFailureWithMeasureConnectorNameRepeat() throws Exception {
+    @Test(expected = GriffinException.BadRequestException.class)
+    public void testAddJobForFailureWithMeasureConnectorNameDuplicate() throws Exception {
         JobSchedule js = createJobSchedule();
         DataConnector dcSource = createDataConnector("connector_name", "default", "test_data_src", "dt=#YYYYMMdd# AND hour=#HH#");
         DataConnector dcTarget = createDataConnector("connector_name", "default", "test_data_tgt", "dt=#YYYYMMdd# AND hour=#HH#");
         GriffinMeasure measure = createGriffinMeasure("measureName", dcSource, dcTarget);
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
-    @Test
+    @Test(expected = GriffinException.BadRequestException.class)
     public void testAddJobForFailureWithJobScheduleConnectorNameRepeat() throws Exception {
         GriffinMeasure measure = createGriffinMeasure("measureName");
         JobDataSegment source = createJobDataSegment("source_name", true);
         JobDataSegment target = createJobDataSegment("source_name", false);
         JobSchedule js = createJobSchedule("jobName", source, target);
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
-    @Test
+    @Test(expected = GriffinException.ConflictException.class)
     public void testAddJobForFailureWithTriggerKeyExist() throws Exception {
         GriffinMeasure measure = createGriffinMeasure("measureName");
         JobDataSegment source = createJobDataSegment("source_name", true);
@@ -234,8 +231,8 @@ public class JobServiceImplTest {
         given(factory.getObject()).willReturn(scheduler);
         given(griffinMeasureRepo.findByIdAndDeleted(js.getMeasureId(), false)).willReturn(measure);
         given(scheduler.checkExists(Matchers.any(TriggerKey.class))).willReturn(true);
-        GriffinOperationMessage message = service.addJob(js);
-        assertEquals(message, CREATE_JOB_FAIL);
+
+        service.addJob(js);
     }
 
     @Test
@@ -245,10 +242,15 @@ public class JobServiceImplTest {
         JobInstanceBean instance = new JobInstanceBean(LivySessionStates.State.finding, "pName", "pGroup", null, null);
         job.setJobInstances(Arrays.asList(instance));
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(job);
+        given(factory.getObject()).willReturn(scheduler);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
-        assertEquals(service.deleteJob(jobId), DELETE_JOB_SUCCESS);
+
+        service.deleteJob(jobId);
+        verify(scheduler, times(2)).checkExists(Matchers.any(JobKey.class));
+        verify(scheduler, times(1)).pauseJob(Matchers.any(JobKey.class));
+        verify(scheduler, times(1)).deleteJob(Matchers.any(JobKey.class));
+        verify(jobRepo, times(1)).save(Matchers.any(GriffinJob.class));
     }
 
     @Test
@@ -261,28 +263,33 @@ public class JobServiceImplTest {
         given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(job);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(false);
-        assertEquals(service.deleteJob(jobId), DELETE_JOB_SUCCESS);
+
+        service.deleteJob(jobId);
+        verify(scheduler, times(2)).checkExists(Matchers.any(JobKey.class));
+        verify(scheduler, times(0)).pauseJob(Matchers.any(JobKey.class));
+        verify(scheduler, times(0)).deleteJob(Matchers.any(JobKey.class));
+        verify(jobRepo, times(1)).save(Matchers.any(GriffinJob.class));
     }
 
-    @Test
-    public void testDeleteJobByIdForFailureWithNull() throws SchedulerException {
-        Long jobId = 1L;
-        given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(null);
-        assertEquals(service.deleteJob(jobId), DELETE_JOB_FAIL);
+    @Test(expected = GriffinException.NotFoundException.class)
+    public void testDeleteJobByIdForFailureWithJobNotFound() {
+        given(jobRepo.findByIdAndDeleted(1L, false)).willReturn(null);
+
+        service.deleteJob(1L);
     }
 
-    @Test
+    @Test(expected = GriffinException.ServiceException.class)
     public void testDeleteJobByIdForFailureWithException() throws SchedulerException {
         Long jobId = 1L;
-        GriffinJob job = new GriffinJob(1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         Scheduler scheduler = Mockito.mock(Scheduler.class);
         given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(job);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
         doThrow(SchedulerException.class).when(scheduler).pauseJob(Matchers.any(JobKey.class));
-        assertEquals(service.deleteJob(jobId), DELETE_JOB_FAIL);
-    }
 
+        service.deleteJob(jobId);
+    }
 
     @Test
     public void testDeleteJobByNameForSuccessWithTriggerKeyExist() throws SchedulerException {
@@ -293,7 +300,15 @@ public class JobServiceImplTest {
         given(jobRepo.findByJobNameAndDeleted(job.getJobName(), false)).willReturn(Arrays.asList(job));
         given(factory.getObject()).willReturn(scheduler);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
-        assertEquals(service.deleteJob(job.getJobName()), DELETE_JOB_SUCCESS);
+        doNothing().when(scheduler).pauseJob(Matchers.any(JobKey.class));
+        given(scheduler.deleteJob(Matchers.any(JobKey.class))).willReturn(true);
+
+        service.deleteJob(job.getJobName());
+        verify(scheduler, times(2)).checkExists(Matchers.any(JobKey.class));
+        verify(scheduler, times(1)).pauseJob(Matchers.any(JobKey.class));
+        verify(scheduler, times(1)).deleteJob(Matchers.any(JobKey.class));
+        verify(jobRepo, times(1)).save(Matchers.any(GriffinJob.class));
+
     }
 
     @Test
@@ -302,104 +317,116 @@ public class JobServiceImplTest {
         JobInstanceBean instance = new JobInstanceBean(LivySessionStates.State.finding, "pName", "pGroup", null, null);
         job.setJobInstances(Arrays.asList(instance));
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        given(jobRepo.findByJobNameAndDeleted(job.getJobName(), false)).willReturn(Arrays.asList(job));
         given(factory.getObject()).willReturn(scheduler);
+        given(jobRepo.findByJobNameAndDeleted(job.getJobName(), false)).willReturn(Arrays.asList(job));
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(false);
-        assertEquals(service.deleteJob(job.getJobName()), DELETE_JOB_SUCCESS);
+
+        service.deleteJob(job.getJobName());
+        verify(scheduler, times(2)).checkExists(Matchers.any(JobKey.class));
+        verify(scheduler, times(0)).pauseJob(Matchers.any(JobKey.class));
+        verify(scheduler, times(0)).deleteJob(Matchers.any(JobKey.class));
+        verify(jobRepo, times(1)).save(Matchers.any(GriffinJob.class));
     }
 
-    @Test
-    public void testDeleteJobByJobNameForFailureWithNull() throws SchedulerException {
+    @Test(expected = GriffinException.NotFoundException.class)
+    public void testDeleteJobByJobNameForFailureWithJobNotFound() {
         String jobName = "jobName";
         given(jobRepo.findByJobNameAndDeleted(jobName, false)).willReturn(new ArrayList<>());
-        assertEquals(service.deleteJob(jobName), DELETE_JOB_FAIL);
+
+        service.deleteJob(jobName);
     }
 
-    @Test
+    @Test(expected = GriffinException.ServiceException.class)
     public void testDeleteJobByJobNameForFailureWithException() throws SchedulerException {
-        Long jobId = 1L;
-        GriffinJob job = new GriffinJob(1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         Scheduler scheduler = Mockito.mock(Scheduler.class);
         given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByJobNameAndDeleted(job.getJobName(), false)).willReturn(Arrays.asList(job));
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
         doThrow(SchedulerException.class).when(scheduler).pauseJob(Matchers.any(JobKey.class));
-        assertEquals(service.deleteJob(jobId), DELETE_JOB_FAIL);
+
+        service.deleteJob(job.getJobName());
     }
 
     @Test
     public void testDeleteJobsRelateToMeasureForSuccessWithTriggerKeyExist() throws SchedulerException {
-        Long jobId = 1L;
-        Long measureId = 1L;
-        GriffinJob job = new GriffinJob(measureId, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         JobInstanceBean instance = new JobInstanceBean(LivySessionStates.State.finding, "pName", "pGroup", null, null);
         job.setJobInstances(Arrays.asList(instance));
         Scheduler scheduler = Mockito.mock(Scheduler.class);
+        given(jobRepo.findByMeasureIdAndDeleted(1L, false)).willReturn(Arrays.asList(job));
         given(factory.getObject()).willReturn(scheduler);
-        given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(job);
-        given(jobRepo.findByMeasureIdAndDeleted(measureId, false)).willReturn(Arrays.asList(job));
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
-        assertEquals(service.deleteJobsRelateToMeasure(measureId), true);
+
+        service.deleteJobsRelateToMeasure(1L);
+        verify(scheduler, times(2)).checkExists(Matchers.any(JobKey.class));
+        verify(scheduler, times(1)).pauseJob(Matchers.any(JobKey.class));
+        verify(scheduler, times(1)).deleteJob(Matchers.any(JobKey.class));
+        verify(jobRepo, times(1)).save(Matchers.any(GriffinJob.class));
     }
 
     @Test
     public void testDeleteJobsRelateToMeasureForSuccessWithTriggerKeyNotExist() throws SchedulerException {
-        Long jobId = 1L;
-        Long measureId = 1L;
-        GriffinJob job = new GriffinJob(measureId, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         JobInstanceBean instance = new JobInstanceBean(LivySessionStates.State.finding, "pName", "pGroup", null, null);
         job.setJobInstances(Arrays.asList(instance));
         Scheduler scheduler = Mockito.mock(Scheduler.class);
+        given(jobRepo.findByMeasureIdAndDeleted(1L, false)).willReturn(Arrays.asList(job));
         given(factory.getObject()).willReturn(scheduler);
-        given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(job);
-        given(jobRepo.findByMeasureIdAndDeleted(measureId, false)).willReturn(Arrays.asList(job));
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(false);
-        assertEquals(service.deleteJobsRelateToMeasure(measureId), true);
+
+        service.deleteJobsRelateToMeasure(1L);
+        verify(scheduler, times(2)).checkExists(Matchers.any(JobKey.class));
+        verify(scheduler, times(0)).pauseJob(Matchers.any(JobKey.class));
+        verify(scheduler, times(0)).deleteJob(Matchers.any(JobKey.class));
+        verify(jobRepo, times(1)).save(Matchers.any(GriffinJob.class));
     }
 
     @Test
-    public void testDeleteJobsRelateToMeasureForSuccessWithNull() throws SchedulerException {
+    public void testDeleteJobsRelateToMeasureForSuccessWithJobNotExist() {
         Long measureId = 1L;
-        Scheduler scheduler = Mockito.mock(Scheduler.class);
-        given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByMeasureIdAndDeleted(measureId, false)).willReturn(null);
-        assertEquals(service.deleteJobsRelateToMeasure(measureId), true);
+
+        service.deleteJobsRelateToMeasure(measureId);
+        verify(jobRepo, times(1)).findByMeasureIdAndDeleted(measureId, false);
+        verify(factory, times(0)).getObject();
     }
 
-    @Test
+    @Test(expected = GriffinException.ServiceException.class)
     public void testDeleteJobsRelateToMeasureForFailureWithException() throws SchedulerException {
-        Long jobId = 1L;
         Long measureId = 1L;
-        GriffinJob job = new GriffinJob(measureId, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         JobInstanceBean instance = new JobInstanceBean(LivySessionStates.State.finding, "pName", "pGroup", null, null);
         job.setJobInstances(Arrays.asList(instance));
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        given(factory.getObject()).willReturn(scheduler);
-        given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(job);
         given(jobRepo.findByMeasureIdAndDeleted(measureId, false)).willReturn(Arrays.asList(job));
+        given(factory.getObject()).willReturn(scheduler);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
         doThrow(SchedulerException.class).when(scheduler).pauseJob(Matchers.any(JobKey.class));
-        assertEquals(service.deleteJobsRelateToMeasure(measureId), false);
+
+        service.deleteJobsRelateToMeasure(measureId);
     }
 
     @Test
-    public void testFindInstancesOfJobForSuccess() throws SchedulerException {
+    public void testFindInstancesOfJobForSuccess() {
         Long jobId = 1L;
         int page = 0;
         int size = 2;
-        GriffinJob job = new GriffinJob(1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         JobInstanceBean jobInstance = new JobInstanceBean(1L, LivySessionStates.State.dead, "app_id", "app_uri", null, null);
-        Pageable pageRequest = new PageRequest(page, size, Sort.Direction.DESC, "tms");
         given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(job);
-        given(jobInstanceRepo.findByJobId(1L, pageRequest)).willReturn(Arrays.asList(jobInstance));
-        assertEquals(service.findInstancesOfJob(1L, page, size).size(), 1);
+        given(jobInstanceRepo.findByJobId(Matchers.anyLong(), Matchers.any(PageRequest.class))).willReturn(Arrays.asList(jobInstance));
+
+        List<JobInstanceBean> jobInstanceBeans = service.findInstancesOfJob(1L, page, size);
+        assertEquals(jobInstanceBeans.size(), 1);
     }
 
-    @Test
-    public void testFindInstancesOfJobWithNull() throws SchedulerException {
+    @Test(expected = GriffinException.NotFoundException.class)
+    public void testFindInstancesOfJobWithJobNotFound() {
         Long jobId = 1L;
         given(jobRepo.findByIdAndDeleted(jobId, false)).willReturn(null);
-        assertEquals(service.findInstancesOfJob(jobId, 0, 2).size(), 0);
+
+        service.findInstancesOfJob(jobId, 0, 2);
     }
 
     @Test
@@ -409,7 +436,10 @@ public class JobServiceImplTest {
         Scheduler scheduler = Mockito.mock(Scheduler.class);
         given(factory.getObject()).willReturn(scheduler);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
+
         service.deleteExpiredJobInstance();
+        verify(scheduler, times(1)).pauseJob(Matchers.any(JobKey.class));
+        verify(jobInstanceRepo, times(1)).deleteByExpireTimestamp(Matchers.any());
     }
 
     @Test
@@ -419,13 +449,19 @@ public class JobServiceImplTest {
         Scheduler scheduler = Mockito.mock(Scheduler.class);
         given(factory.getObject()).willReturn(scheduler);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(false);
+
         service.deleteExpiredJobInstance();
+        verify(scheduler, times(0)).pauseJob(Matchers.any(JobKey.class));
+        verify(jobInstanceRepo, times(1)).deleteByExpireTimestamp(Matchers.any());
     }
 
     @Test
-    public void testDeleteExpiredJobInstanceForSuccessWithNull() throws SchedulerException {
+    public void testDeleteExpiredJobInstanceForSuccessWithNoInstance() {
         given(jobInstanceRepo.findByExpireTmsLessThanEqual(Matchers.any())).willReturn(null);
+
         service.deleteExpiredJobInstance();
+        verify(jobInstanceRepo, times(1)).deleteByExpireTimestamp(Matchers.any());
+
     }
 
     @Test
@@ -436,7 +472,9 @@ public class JobServiceImplTest {
         given(factory.getObject()).willReturn(scheduler);
         given(scheduler.checkExists(Matchers.any(JobKey.class))).willReturn(true);
         doThrow(SchedulerException.class).when(scheduler).pauseJob(Matchers.any(JobKey.class));
+
         service.deleteExpiredJobInstance();
+        verify(jobInstanceRepo, times(0)).deleteByExpireTimestamp(Matchers.any());
     }
 
     @Test
@@ -446,7 +484,9 @@ public class JobServiceImplTest {
         Whitebox.setInternalState(service, "restTemplate", restTemplate);
         String result = "{\"id\":1,\"state\":\"starting\",\"appId\":123,\"appInfo\":{\"driverLogUrl\":null,\"sparkUiUrl\":null},\"log\":[]}";
         given(restTemplate.getForObject(Matchers.anyString(), Matchers.any())).willReturn(result);
+
         service.syncInstancesOfAllJobs();
+        verify(jobInstanceRepo, times(1)).save(instance);
     }
 
     @Test
@@ -456,52 +496,58 @@ public class JobServiceImplTest {
         given(jobInstanceRepo.findByActiveState()).willReturn(Arrays.asList(instance));
         Whitebox.setInternalState(service, "restTemplate", restTemplate);
         given(restTemplate.getForObject(Matchers.anyString(), Matchers.any())).willThrow(RestClientException.class);
+
         service.syncInstancesOfAllJobs();
+        verify(jobInstanceRepo, times(1)).save(instance);
     }
 
     @Test
-    public void testSyncInstancesOfJobForFailureWithIOException() throws Exception {
+    public void testSyncInstancesOfJobForFailureWithIOException() {
         JobInstanceBean instance = createJobInstance();
         given(jobInstanceRepo.findByActiveState()).willReturn(Arrays.asList(instance));
         Whitebox.setInternalState(service, "restTemplate", restTemplate);
         given(restTemplate.getForObject(Matchers.anyString(), Matchers.any())).willReturn("result");
+
         service.syncInstancesOfAllJobs();
+        verify(jobInstanceRepo, times(0)).save(instance);
     }
 
     @Test
-    public void testSyncInstancesOfJobForFailureWithIllegalArgumentException() throws Exception {
+    public void testSyncInstancesOfJobForFailureWithIllegalArgumentException() {
         JobInstanceBean instance = createJobInstance();
         given(jobInstanceRepo.findByActiveState()).willReturn(Arrays.asList(instance));
         Whitebox.setInternalState(service, "restTemplate", restTemplate);
         given(restTemplate.getForObject(Matchers.anyString(), Matchers.any())).willReturn("{\"state\":\"wrong\"}");
+
         service.syncInstancesOfAllJobs();
+        verify(jobInstanceRepo, times(0)).save(instance);
     }
 
     @Test
-    public void testSyncInstancesOfJobForFailureWithException() throws Exception {
+    public void testSyncInstancesOfJobForFailureWithException() {
         JobInstanceBean instance = createJobInstance();
         given(jobInstanceRepo.findByActiveState()).willReturn(Arrays.asList(instance));
         Whitebox.setInternalState(service, "restTemplate", restTemplate);
         String result = "{\"id\":1,\"state\":\"starting\",\"appId\":123,\"appInfo\":{\"driverLogUrl\":null,\"sparkUiUrl\":null},\"log\":[]}";
         given(restTemplate.getForObject(Matchers.anyString(), Matchers.any())).willReturn(result);
         doThrow(Exception.class).when(jobInstanceRepo).save(Matchers.any(JobInstanceBean.class));
+
         service.syncInstancesOfAllJobs();
+        verify(restTemplate, times(1)).getForObject(Matchers.anyString(), Matchers.any());
+        verify(sparkJobProps, times(2)).getProperty(Matchers.anyString());
     }
 
     @Test
     public void testGetHealthInfoWithHealthy() throws SchedulerException {
-        Long jobId = 1L;
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        GriffinJob job = new GriffinJob(jobId, 1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         given(factory.getObject()).willReturn(scheduler);
         given(jobRepo.findByDeleted(false)).willReturn(Arrays.asList(job));
-        SimpleTrigger trigger = new SimpleTriggerImpl();
-        List<Trigger> triggers = new ArrayList<>();
-        triggers.add(trigger);
+        List<Trigger> triggers = Collections.singletonList(new SimpleTriggerImpl());
         given((List<Trigger>) scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willReturn(triggers);
+        given(jobInstanceRepo.findByJobId(Matchers.anyLong(), Matchers.any(PageRequest.class)))
+                .willReturn(Collections.singletonList(createJobInstance()));
 
-        Pageable pageRequest = new PageRequest(0, 1, Sort.Direction.DESC, "tms");
-        given(jobInstanceRepo.findByJobId(jobId, pageRequest)).willReturn(Arrays.asList(createJobInstance()));
         assertEquals(service.getHealthInfo().getHealthyJobCount(), 1);
 
     }
@@ -509,52 +555,30 @@ public class JobServiceImplTest {
     @Test
     public void testGetHealthInfoWithUnhealthy() throws SchedulerException {
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        GriffinJob job = new GriffinJob(1L, 1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         given(factory.getObject()).willReturn(scheduler);
-        given(jobRepo.findByDeleted(false)).willReturn(Arrays.asList(job));
-        SimpleTrigger trigger = new SimpleTriggerImpl();
-        given((List<Trigger>) scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willReturn(Arrays.asList(trigger));
-
-        Pageable pageRequest = new PageRequest(0, 1, Sort.Direction.DESC, "tms");
-        List<JobInstanceBean> scheduleStateList = new ArrayList<>();
+        given(jobRepo.findByDeleted(false)).willReturn(Collections.singletonList(job));
+        List<Trigger> triggers = Collections.singletonList(new SimpleTriggerImpl());
+        given((List<Trigger>) scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willReturn(triggers);
         JobInstanceBean instance = createJobInstance();
         instance.setState(LivySessionStates.State.error);
-        scheduleStateList.add(instance);
-        given(jobInstanceRepo.findByJobId(1L, pageRequest)).willReturn(scheduleStateList);
+        List<JobInstanceBean> scheduleStateList = Collections.singletonList(instance);
+        given(jobInstanceRepo.findByJobId(Matchers.anyLong(), Matchers.any(PageRequest.class)))
+                .willReturn(scheduleStateList);
+
         assertEquals(service.getHealthInfo().getHealthyJobCount(), 0);
     }
 
-    @Test
+    @Test(expected = GriffinException.ServiceException.class)
     public void testGetHealthInfoWithException() throws SchedulerException {
         Scheduler scheduler = Mockito.mock(Scheduler.class);
-        GriffinJob job = new GriffinJob(1L, 1L, "jobName", "quartzJobName", "quartzGroupName", false);
+        GriffinJob job = createGriffinJob();
         given(factory.getObject()).willReturn(scheduler);
-        given(jobRepo.findByDeleted(false)).willReturn(Arrays.asList(job));
-        GriffinException.GetHealthInfoFailureException exception = getExceptionForHealthInfo(scheduler);
-        assert exception != null;
-    }
-
-
-    private GriffinException.GetHealthInfoFailureException getExceptionForHealthInfo(Scheduler scheduler) throws SchedulerException {
-        GriffinException.GetHealthInfoFailureException exception = null;
-        try {
-            given(scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willThrow(SchedulerException.class);
-            service.getHealthInfo();
-        } catch (GriffinException.GetHealthInfoFailureException e) {
-            exception = e;
-        }
-        return exception;
-    }
+        given(jobRepo.findByDeleted(false)).willReturn(Collections.singletonList(job));
+        given((List<Trigger>) scheduler.getTriggersOfJob(Matchers.any(JobKey.class)))
+                .willThrow(new SchedulerException());
 
-    private GriffinException.GetJobsFailureException getExceptionForGetAliveJObs(Scheduler scheduler) throws SchedulerException {
-        GriffinException.GetJobsFailureException exception = null;
-        try {
-            given(scheduler.getTriggersOfJob(Matchers.any(JobKey.class))).willThrow(new GriffinException.GetJobsFailureException());
-            service.getAliveJobs();
-        } catch (GriffinException.GetJobsFailureException e) {
-            exception = e;
-        }
-        return exception;
+        service.getHealthInfo();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/job/SparkSubmitJobTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/job/SparkSubmitJobTest.java b/service/src/test/java/org/apache/griffin/core/job/SparkSubmitJobTest.java
index ccb641b..b252782 100644
--- a/service/src/test/java/org/apache/griffin/core/job/SparkSubmitJobTest.java
+++ b/service/src/test/java/org/apache/griffin/core/job/SparkSubmitJobTest.java
@@ -42,12 +42,13 @@ import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.web.client.RestTemplate;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Properties;
 
 import static org.apache.griffin.core.util.EntityHelper.*;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.*;
 
 
 @RunWith(SpringRunner.class)
@@ -71,10 +72,6 @@ public class SparkSubmitJobTest {
     @Autowired
     private SparkSubmitJob sparkSubmitJob;
 
-    @Autowired
-    @Qualifier("livyConf")
-    private Properties livyConfProps;
-
     @MockBean
     private RestTemplate restTemplate;
 
@@ -95,10 +92,11 @@ public class SparkSubmitJobTest {
         JobInstanceBean instance = createJobInstance();
         GriffinMeasure measure = createGriffinMeasure("measureName");
         SegmentPredicate predicate = createFileExistPredicate();
-        JobDetail jd = createJobDetail(JsonUtil.toJson(measure), JsonUtil.toJson(Arrays.asList(predicate)));
+        JobDetail jd = createJobDetail(JsonUtil.toJson(measure), JsonUtil.toJson(Collections.singletonList(predicate)));
         given(context.getJobDetail()).willReturn(jd);
         given(context.getTrigger()).willReturn(createSimpleTrigger(4, 5));
         given(jobInstanceRepo.findByPredicateName(Matchers.anyString())).willReturn(instance);
+
         sparkSubmitJob.execute(context);
         assertTrue(true);
     }
@@ -109,10 +107,11 @@ public class SparkSubmitJobTest {
         JobInstanceBean instance = createJobInstance();
         GriffinMeasure measure = createGriffinMeasure("measureName");
         SegmentPredicate predicate = createFileExistPredicate();
-        JobDetail jd = createJobDetail(JsonUtil.toJson(measure), JsonUtil.toJson(Arrays.asList(predicate)));
+        JobDetail jd = createJobDetail(JsonUtil.toJson(measure), JsonUtil.toJson(Collections.singletonList(predicate)));
         given(context.getJobDetail()).willReturn(jd);
         given(context.getTrigger()).willReturn(createSimpleTrigger(4, 4));
         given(jobInstanceRepo.findByPredicateName(Matchers.anyString())).willReturn(instance);
+
         sparkSubmitJob.execute(context);
         assertTrue(true);
     }
@@ -128,7 +127,8 @@ public class SparkSubmitJobTest {
         given(jobInstanceRepo.findByPredicateName(Matchers.anyString())).willReturn(instance);
         Whitebox.setInternalState(sparkSubmitJob, "restTemplate", restTemplate);
         given(restTemplate.postForObject(Matchers.anyString(), Matchers.any(), Matchers.any())).willReturn(result);
-        given(jobService.pauseJob(Matchers.any(), Matchers.any())).willReturn(true);
+        doNothing().when(jobService).pauseJob(Matchers.any(), Matchers.any());
+
         sparkSubmitJob.execute(context);
         assertTrue(true);
     }
@@ -141,14 +141,16 @@ public class SparkSubmitJobTest {
         JobDetail jd = createJobDetail(JsonUtil.toJson(measure), "");
         given(context.getJobDetail()).willReturn(jd);
         given(jobInstanceRepo.findByPredicateName(Matchers.anyString())).willReturn(instance);
-        given(jobService.pauseJob(Matchers.any(), Matchers.any())).willReturn(true);
+        doNothing().when(jobService).pauseJob(Matchers.any(), Matchers.any());
+
         sparkSubmitJob.execute(context);
         assertTrue(true);
     }
 
     @Test
-    public void testExecuteWithNullException() throws Exception {
+    public void testExecuteWithNullException() {
         JobExecutionContext context = mock(JobExecutionContext.class);
+
         sparkSubmitJob.execute(context);
         assertTrue(true);
     }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/measure/ExternalMeasureOperationImplTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/measure/ExternalMeasureOperationImplTest.java b/service/src/test/java/org/apache/griffin/core/measure/ExternalMeasureOperationImplTest.java
new file mode 100644
index 0000000..dee01cb
--- /dev/null
+++ b/service/src/test/java/org/apache/griffin/core/measure/ExternalMeasureOperationImplTest.java
@@ -0,0 +1,102 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.griffin.core.measure;
+
+import org.apache.griffin.core.exception.GriffinException;
+import org.apache.griffin.core.job.entity.VirtualJob;
+import org.apache.griffin.core.job.repo.VirtualJobRepo;
+import org.apache.griffin.core.measure.entity.ExternalMeasure;
+import org.apache.griffin.core.measure.repo.ExternalMeasureRepo;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.apache.griffin.core.util.EntityHelper.createExternalMeasure;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+@RunWith(SpringRunner.class)
+public class ExternalMeasureOperationImplTest {
+
+    @InjectMocks
+    private ExternalMeasureOperationImpl operation;
+
+    @Mock
+    private ExternalMeasureRepo measureRepo;
+    @Mock
+    private VirtualJobRepo jobRepo;
+
+    @Before
+    public void setup() {
+    }
+
+
+    @Test
+    public void testCreateForSuccess() {
+        ExternalMeasure measure = createExternalMeasure("view_item_hourly");
+        given(measureRepo.save(measure)).willReturn(measure);
+        given(jobRepo.save(Matchers.any(VirtualJob.class))).willReturn(new VirtualJob());
+
+        operation.create(measure);
+        verify(jobRepo, times(1)).save(new VirtualJob());
+    }
+
+    @Test(expected = GriffinException.BadRequestException.class)
+    public void testCreateForFailureWithBlankMetricName() {
+        String measureName = "view_item_hourly";
+        ExternalMeasure measure = createExternalMeasure(measureName);
+        measure.setMetricName("  ");
+        operation.create(measure);
+    }
+
+    @Test
+    public void testUpdateForSuccess() {
+        ExternalMeasure measure = createExternalMeasure("view_item_hourly");
+        measure.setId(1L);
+        given(measureRepo.findOne(1L)).willReturn(measure);
+        given(measureRepo.save(Matchers.any(ExternalMeasure.class))).willReturn(measure);
+
+        operation.create(measure);
+        verify(measureRepo, times(1)).save(Matchers.any(ExternalMeasure.class));
+    }
+
+    @Test(expected = GriffinException.BadRequestException.class)
+    public void testUpdateForFailureWithBlankMetricName() {
+        String measureName = "view_item_hourly";
+        ExternalMeasure measure = createExternalMeasure(measureName);
+        measure.setMetricName("  ");
+
+        operation.update(measure);
+    }
+
+    @Test
+    public void testDeleteForSuccess() {
+        ExternalMeasure measure = createExternalMeasure("view_item_hourly");
+        given(measureRepo.save(measure)).willReturn(measure);
+
+        operation.delete(measure);
+        verify(measureRepo, times(1)).save(measure);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/measure/GriffinMeasureOperationImplTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/measure/GriffinMeasureOperationImplTest.java b/service/src/test/java/org/apache/griffin/core/measure/GriffinMeasureOperationImplTest.java
new file mode 100644
index 0000000..47f218a
--- /dev/null
+++ b/service/src/test/java/org/apache/griffin/core/measure/GriffinMeasureOperationImplTest.java
@@ -0,0 +1,120 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.griffin.core.measure;
+
+import org.apache.griffin.core.exception.GriffinException;
+import org.apache.griffin.core.job.JobServiceImpl;
+import org.apache.griffin.core.measure.entity.DataConnector;
+import org.apache.griffin.core.measure.entity.GriffinMeasure;
+import org.apache.griffin.core.measure.entity.Measure;
+import org.apache.griffin.core.measure.repo.DataConnectorRepo;
+import org.apache.griffin.core.measure.repo.MeasureRepo;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+
+import static org.apache.griffin.core.util.EntityHelper.createDataConnector;
+import static org.apache.griffin.core.util.EntityHelper.createGriffinMeasure;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.*;
+
+@RunWith(SpringRunner.class)
+public class GriffinMeasureOperationImplTest {
+
+    @InjectMocks
+    private GriffinMeasureOperationImpl operation;
+
+    @Mock
+    private MeasureRepo<Measure> measureRepo;
+    @Mock
+    private DataConnectorRepo dcRepo;
+    @Mock
+    private JobServiceImpl jobService;
+
+
+    @Before
+    public void setup() {
+    }
+
+    @Test
+    public void testCreateForSuccess() throws Exception {
+        Measure measure = createGriffinMeasure("view_item_hourly");
+        given(measureRepo.save(measure)).willReturn(measure);
+
+        Measure m = operation.create(measure);
+        assertEquals(m.getName(), measure.getName());
+    }
+
+    @Test(expected = GriffinException.BadRequestException.class)
+    public void testCreateForFailureWithConnectorExist() throws Exception {
+        Measure measure = createGriffinMeasure("view_item_hourly");
+        DataConnector dc = new DataConnector("source_name", "1h", "1.2", null);
+        given(dcRepo.findByConnectorNames(Arrays.asList("source_name", "target_name"))).willReturn(Arrays.asList(dc));
+
+        operation.create(measure);
+    }
+
+    @Test(expected = GriffinException.BadRequestException.class)
+    public void testCreateForFailureWithConnectorNull() throws Exception {
+        String measureName = "view_item_hourly";
+        DataConnector dcSource = createDataConnector(null, "default", "test_data_src", "dt=#YYYYMMdd# AND hour=#HH#");
+        DataConnector dcTarget = createDataConnector(null, "default", "test_data_tgt", "dt=#YYYYMMdd# AND hour=#HH#");
+        GriffinMeasure measure = createGriffinMeasure(measureName, dcSource, dcTarget);
+
+        operation.create(measure);
+    }
+
+    @Test
+    public void testUpdateForSuccess() throws Exception {
+        Measure measure = createGriffinMeasure("view_item_hourly");
+        given(measureRepo.save(measure)).willReturn(measure);
+
+        operation.update(measure);
+        verify(measureRepo, times(1)).save(measure);
+    }
+
+    @Test
+    public void testDeleteForSuccess() throws Exception {
+        Measure measure = createGriffinMeasure("view_item_hourly");
+        measure.setId(1L);
+        doNothing().when(jobService).deleteJobsRelateToMeasure(1L);
+        given(measureRepo.save(measure)).willReturn(measure);
+
+        operation.update(measure);
+        verify(measureRepo, times(1)).save(measure);
+    }
+
+    @Test(expected = GriffinException.ServiceException.class)
+    public void testDeleteForFailureWithPauseJob() throws Exception {
+        Measure measure = createGriffinMeasure("view_item_hourly");
+        measure.setId(1L);
+        doThrow(new GriffinException.ServiceException("Service exception", new RuntimeException()))
+                .when(jobService).deleteJobsRelateToMeasure(1L);
+
+        operation.delete(measure);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java b/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
index 5eb5a11..c564333 100644
--- a/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
+++ b/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
@@ -19,45 +19,54 @@ under the License.
 
 package org.apache.griffin.core.measure;
 
+import org.apache.griffin.core.exception.GriffinException;
+import org.apache.griffin.core.exception.GriffinExceptionHandler;
+import org.apache.griffin.core.exception.GriffinExceptionMessage;
+import org.apache.griffin.core.measure.entity.GriffinMeasure;
 import org.apache.griffin.core.measure.entity.Measure;
-import org.apache.griffin.core.util.GriffinOperationMessage;
 import org.apache.griffin.core.util.JsonUtil;
 import org.apache.griffin.core.util.URLHelper;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.springframework.http.MediaType;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
 import static org.apache.griffin.core.util.EntityHelper.createGriffinMeasure;
-import static org.apache.griffin.core.util.GriffinOperationMessage.*;
 import static org.hamcrest.CoreMatchers.is;
 import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 @RunWith(SpringRunner.class)
-@WebMvcTest(value = MeasureController.class, secure = false)
 public class MeasureControllerTest {
-    @Autowired
+
     private MockMvc mvc;
 
-    @MockBean
-    private MeasureService service;
+    @Mock
+    private MeasureServiceImpl service;
+
+    @InjectMocks
+    private MeasureController controller;
 
 
     @Before
     public void setup() {
-
+        mvc = MockMvcBuilders
+                .standaloneSetup(controller)
+                .setControllerAdvice(new GriffinExceptionHandler())
+                .build();
     }
 
     @Test
@@ -84,66 +93,63 @@ public class MeasureControllerTest {
 
     @Test
     public void testDeleteMeasuresByIdForSuccess() throws Exception {
-        given(service.deleteMeasureById(1L)).willReturn(DELETE_MEASURE_BY_ID_SUCCESS);
+        doNothing().when(service).deleteMeasureById(1L);
 
         mvc.perform(delete(URLHelper.API_VERSION_PATH + "/measures/1"))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(202)));
+                .andExpect(status().isNoContent());
     }
 
     @Test
     public void testDeleteMeasuresByIdForNotFound() throws Exception {
-        given(service.deleteMeasureById(1L)).willReturn(RESOURCE_NOT_FOUND);
+        doThrow(new GriffinException.NotFoundException(GriffinExceptionMessage.MEASURE_ID_DOES_NOT_EXIST))
+                .when(service).deleteMeasureById(1L);
 
         mvc.perform(delete(URLHelper.API_VERSION_PATH + "/measures/1"))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(400)));
+                .andExpect(status().isNotFound());
     }
 
     @Test
-    public void testDeleteMeasuresByIdForFail() throws Exception {
-        given(service.deleteMeasureById(1L)).willReturn(DELETE_MEASURE_BY_ID_FAIL);
+    public void testDeleteMeasuresByIdForGriffinFailureWithException() throws Exception {
+        doThrow(new GriffinException.ServiceException("Failed to delete job", new Exception()))
+                .when(service).deleteMeasureById(1L);
 
         mvc.perform(delete(URLHelper.API_VERSION_PATH + "/measures/1"))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(402)));
+                .andExpect(status().isInternalServerError());
     }
 
     @Test
     public void testUpdateMeasureForSuccess() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         String measureJson = JsonUtil.toJson(measure);
-        given(service.updateMeasure(measure)).willReturn(UPDATE_MEASURE_SUCCESS);
+        doNothing().when(service).updateMeasure(measure);
 
         mvc.perform(put(URLHelper.API_VERSION_PATH + "/measures")
                 .contentType(MediaType.APPLICATION_JSON).content(measureJson))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(204)));
+                .andExpect(status().isNoContent());
     }
 
     @Test
     public void testUpdateMeasureForNotFound() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         String measureJson = JsonUtil.toJson(measure);
-        given(service.updateMeasure(measure)).willReturn(RESOURCE_NOT_FOUND);
+        doThrow(new GriffinException.NotFoundException(GriffinExceptionMessage.MEASURE_ID_DOES_NOT_EXIST))
+                .when(service).updateMeasure(measure);
 
         mvc.perform(put(URLHelper.API_VERSION_PATH + "/measures")
                 .contentType(MediaType.APPLICATION_JSON).content(measureJson))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(400)));
-
+                .andExpect(status().isNotFound());
     }
 
     @Test
-    public void testUpdateMeasureForFail() throws Exception {
+    public void testUpdateMeasureForTypeMismatch() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         String measureJson = JsonUtil.toJson(measure);
-        given(service.updateMeasure(measure)).willReturn(UPDATE_MEASURE_FAIL);
+        doThrow(new GriffinException.BadRequestException(GriffinExceptionMessage.MEASURE_TYPE_DOES_NOT_MATCH))
+                .when(service).updateMeasure(measure);
 
         mvc.perform(put(URLHelper.API_VERSION_PATH + "/measures")
                 .contentType(MediaType.APPLICATION_JSON).content(measureJson))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(404)));
+                .andExpect(status().isBadRequest());
     }
 
     @Test
@@ -163,37 +169,38 @@ public class MeasureControllerTest {
 
     @Test
     public void testCreateNewMeasureForSuccess() throws Exception {
-        Measure measure = createGriffinMeasure("view_item_hourly");
+        GriffinMeasure measure = createGriffinMeasure("view_item_hourly");
         String measureJson = JsonUtil.toJson(measure);
-        given(service.createMeasure(measure)).willReturn(CREATE_MEASURE_SUCCESS);
+        given(service.createMeasure(measure)).willReturn(measure);
 
         mvc.perform(post(URLHelper.API_VERSION_PATH + "/measures")
                 .contentType(MediaType.APPLICATION_JSON).content(measureJson))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(201)));
+                .andExpect(status().isCreated())
+                .andExpect(jsonPath("$.name", is("view_item_hourly")));
     }
 
     @Test
     public void testCreateNewMeasureForFailWithDuplicate() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         String measureJson = JsonUtil.toJson(measure);
-        given(service.createMeasure(measure)).willReturn(CREATE_MEASURE_FAIL_DUPLICATE);
+        doThrow(new GriffinException.ConflictException(GriffinExceptionMessage.MEASURE_NAME_ALREADY_EXIST))
+                .when(service).createMeasure(measure);
 
         mvc.perform(post(URLHelper.API_VERSION_PATH + "/measures")
                 .contentType(MediaType.APPLICATION_JSON).content(measureJson))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(410)));
+                .andExpect(status().isConflict());
     }
 
     @Test
-    public void testCreateNewMeasureForFailWithSaveException() throws Exception {
+    public void testCreateNewMeasureForFailWithInvalidParams() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         String measureJson = JsonUtil.toJson(measure);
-        given(service.createMeasure(measure)).willReturn(GriffinOperationMessage.CREATE_MEASURE_FAIL);
+        doThrow(new GriffinException.BadRequestException(GriffinExceptionMessage.MISSING_METRIC_NAME))
+                .when(service).createMeasure(measure);
 
-        mvc.perform(post(URLHelper.API_VERSION_PATH + "/measures").contentType(MediaType.APPLICATION_JSON).content(measureJson))
-                .andExpect(status().isOk())
-                .andExpect(jsonPath("$.code", is(401)));
+        mvc.perform(post(URLHelper.API_VERSION_PATH + "/measures")
+                .contentType(MediaType.APPLICATION_JSON).content(measureJson))
+                .andExpect(status().isBadRequest());
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java b/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
index df7fdca..2fd63d9 100644
--- a/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
+++ b/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
@@ -19,7 +19,6 @@ under the License.
 
 package org.apache.griffin.core.measure;
 
-import org.apache.griffin.core.job.JobService;
 import org.apache.griffin.core.util.URLHelper;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,8 +34,6 @@ import java.util.List;
 import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.Matchers.hasKey;
 import static org.hamcrest.Matchers.hasSize;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -53,9 +50,6 @@ public class MeasureOrgControllerTest {
     @MockBean
     private MeasureOrgService measureOrgService;
 
-    @MockBean
-    private JobService jobService;
-
     @Test
     public void testGetOrgs() throws Exception {
         String org = "orgName";

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/6b1a7000/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
----------------------------------------------------------------------
diff --git a/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java b/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
index 857d35f..16e235a 100644
--- a/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
+++ b/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
@@ -20,79 +20,43 @@ under the License.
 package org.apache.griffin.core.measure;
 
 
-import org.apache.griffin.core.job.JobServiceImpl;
-import org.apache.griffin.core.job.repo.VirtualJobRepo;
-import org.apache.griffin.core.measure.entity.DataConnector;
+import org.apache.griffin.core.exception.GriffinException;
 import org.apache.griffin.core.measure.entity.ExternalMeasure;
 import org.apache.griffin.core.measure.entity.GriffinMeasure;
 import org.apache.griffin.core.measure.entity.Measure;
-import org.apache.griffin.core.measure.repo.DataConnectorRepo;
-import org.apache.griffin.core.measure.repo.ExternalMeasureRepo;
-import org.apache.griffin.core.measure.repo.GriffinMeasureRepo;
 import org.apache.griffin.core.measure.repo.MeasureRepo;
-import org.apache.griffin.core.util.GriffinOperationMessage;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Matchers;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.context.annotation.Bean;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
+import java.util.Collections;
 import java.util.List;
 
-import static org.apache.griffin.core.util.EntityHelper.*;
-import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+import static org.apache.griffin.core.util.EntityHelper.createExternalMeasure;
+import static org.apache.griffin.core.util.EntityHelper.createGriffinMeasure;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.*;
 
 @RunWith(SpringRunner.class)
 public class MeasureServiceImplTest {
 
-    @TestConfiguration
-    public static class MeasureServiceConf {
-        @Bean
-        public MeasureServiceImpl measureService() {
-            return new MeasureServiceImpl();
-        }
-
-        @Bean(name = "griffinOperation")
-        public MeasureOperation griffinOperation() {
-            return new GriffinMeasureOperationImpl();
-        }
-
-        @Bean(name = "externalOperation")
-        public MeasureOperation externalOperation() {
-            return new ExternalMeasureOperationImpl();
-        }
-    }
-
-    @Autowired
+    @InjectMocks
     private MeasureServiceImpl service;
 
-    @MockBean
-    private ExternalMeasureRepo externalMeasureRepo;
+    @Mock
+    private MeasureOperation externalOp;
 
-    @MockBean
-    private GriffinMeasureRepo griffinMeasureRepo;
+    @Mock
+    private MeasureOperation griffinOp;
 
-    @MockBean
+    @Mock
     private MeasureRepo<Measure> measureRepo;
 
-    @MockBean
-    private JobServiceImpl jobService;
-
-    @MockBean
-    private DataConnectorRepo dataConnectorRepo;
-
-    @MockBean
-    private VirtualJobRepo jobRepo;
-
     @Before
     public void setup() {
     }
@@ -100,7 +64,8 @@ public class MeasureServiceImplTest {
     @Test
     public void testGetAllMeasures() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
-        given(measureRepo.findByDeleted(false)).willReturn(Arrays.asList(measure));
+        given(measureRepo.findByDeleted(false)).willReturn(Collections.singletonList(measure));
+
         List<Measure> measures = service.getAllAliveMeasures();
         assertEquals(measures.size(), 1);
         assertEquals(measures.get(0).getName(), "view_item_hourly");
@@ -110,6 +75,7 @@ public class MeasureServiceImplTest {
     public void testGetMeasuresById() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         given(measureRepo.findByIdAndDeleted(1L, false)).willReturn(measure);
+
         Measure m = service.getMeasureById(1);
         assertEquals(m.getName(), measure.getName());
     }
@@ -118,7 +84,8 @@ public class MeasureServiceImplTest {
     public void testGetAliveMeasuresByOwner() throws Exception {
         String owner = "test";
         Measure measure = createGriffinMeasure("view_item_hourly");
-        given(measureRepo.findByOwnerAndDeleted(owner, false)).willReturn(Arrays.asList(measure));
+        given(measureRepo.findByOwnerAndDeleted(owner, false)).willReturn(Collections.singletonList(measure));
+
         List<Measure> measures = service.getAliveMeasuresByOwner(owner);
         assertEquals(measures.get(0).getName(), measure.getName());
     }
@@ -129,201 +96,105 @@ public class MeasureServiceImplTest {
         GriffinMeasure measure = createGriffinMeasure("view_item_hourly");
         measure.setId(1L);
         given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        given(jobService.deleteJobsRelateToMeasure(measure.getId())).willReturn(true);
-        GriffinOperationMessage message = service.deleteMeasureById(measure.getId());
-        assertEquals(message, DELETE_MEASURE_BY_ID_SUCCESS);
-    }
+        doNothing().when(griffinOp).delete(measure);
 
-    @Test
-    public void testDeleteMeasuresByIdForGriffinFailureWithPause() throws Exception {
-        GriffinMeasure measure = createGriffinMeasure("view_item_hourly");
-        measure.setId(1L);
-        given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        given(jobService.deleteJobsRelateToMeasure(measure.getId())).willReturn(false);
-        GriffinOperationMessage message = service.deleteMeasureById(measure.getId());
-        assertEquals(message, DELETE_MEASURE_BY_ID_FAIL);
+        service.deleteMeasureById(measure.getId());
+        verify(griffinOp, times(1)).delete(measure);
     }
 
     @Test
-    public void testDeleteMeasuresByIdForGriffinFailureWithException() throws Exception {
-        GriffinMeasure measure = createGriffinMeasure("view_item_hourly");
-        measure.setId(1L);
-        given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        given(jobService.deleteJobsRelateToMeasure(measure.getId())).willReturn(true);
-        given(measureRepo.save(Matchers.any(Measure.class))).willThrow(Exception.class);
-        GriffinOperationMessage message = service.deleteMeasureById(measure.getId());
-        assertEquals(message, DELETE_MEASURE_BY_ID_FAIL);
-    }
-
-    @Test
-    public void testDeleteMeasuresByIdForExternalSuccess() throws Exception {
+    public void testDeleteMeasuresByIdForExternalSuccess() {
         ExternalMeasure measure = createExternalMeasure("externalMeasure");
         measure.setId(1L);
         given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.deleteMeasureById(measure.getId());
-        assertEquals(message, DELETE_MEASURE_BY_ID_SUCCESS);
-    }
+        doNothing().when(externalOp).delete(measure);
 
-    @Test
-    public void testDeleteMeasuresByIdForExternalFailureWithException() throws Exception {
-        ExternalMeasure measure = createExternalMeasure("externalMeasure");
-        measure.setId(1L);
-        given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        given(externalMeasureRepo.save(Matchers.any(ExternalMeasure.class))).willThrow(Exception.class);
-        GriffinOperationMessage message = service.deleteMeasureById(measure.getId());
-        assertEquals(message, DELETE_MEASURE_BY_ID_FAIL);
+        service.deleteMeasureById(1L);
+        verify(externalOp, times(1)).delete(measure);
     }
 
-    @Test
-    public void testDeleteMeasuresByIdForFailureWithNotFound() throws Exception {
+    @Test(expected = GriffinException.NotFoundException.class)
+    public void testDeleteMeasuresByIdFailureWithNotFound() {
         given(measureRepo.findByIdAndDeleted(1L, false)).willReturn(null);
-        GriffinOperationMessage message = service.deleteMeasureById(1L);
-        assertEquals(message, RESOURCE_NOT_FOUND);
-    }
-
-    @Test
-    public void testCreateMeasureForGriffinSuccess() throws Exception {
-        String measureName = "view_item_hourly";
-        GriffinMeasure measure = createGriffinMeasure(measureName);
-        given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(new ArrayList<>());
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_SUCCESS);
-    }
 
-    @Test
-    public void testCreateMeasureForGriffinFailureWithConnectorExist() throws Exception {
-        String measureName = "view_item_hourly";
-        GriffinMeasure measure = createGriffinMeasure(measureName);
-        DataConnector dc = new DataConnector("source_name", "1h", "1.2", null);
-        given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(new LinkedList<>());
-        given(dataConnectorRepo.findByConnectorNames(Arrays.asList("source_name", "target_name"))).willReturn(Arrays.asList(dc));
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_FAIL);
+        service.deleteMeasureById(1L);
     }
 
-    @Test
-    public void testCreateMeasureForGriffinFailureWithConnectorNull() throws Exception {
-        String measureName = "view_item_hourly";
-        DataConnector dcSource = createDataConnector(null, "default", "test_data_src", "dt=#YYYYMMdd# AND hour=#HH#");
-        DataConnector dcTarget = createDataConnector(null, "default", "test_data_tgt", "dt=#YYYYMMdd# AND hour=#HH#");
-        GriffinMeasure measure = createGriffinMeasure(measureName, dcSource, dcTarget);
-        given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(new LinkedList<>());
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_FAIL);
-    }
+    @Test(expected = GriffinException.ServiceException.class)
+    public void testDeleteMeasuresByIdForGriffinFailureWithException() throws Exception {
+        GriffinMeasure measure = createGriffinMeasure("externalMeasure");
+        measure.setId(1L);
+        given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
+        doThrow(new GriffinException.ServiceException("Failed to delete job", new Exception()))
+                .when(griffinOp).delete(measure);
 
-    @Test
-    public void testCreateMeasureForGriffinFailureWithException() throws Exception {
-        String measureName = "view_item_hourly";
-        GriffinMeasure measure = createGriffinMeasure(measureName);
-        given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(new ArrayList<>());
-        given(measureRepo.save(Matchers.any(Measure.class))).willThrow(Exception.class);
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_FAIL);
+        service.deleteMeasureById(1L);
     }
 
     @Test
-    public void testCreateMeasureForExternalSuccess() throws Exception {
+    public void testCreateMeasureForGriffinSuccess() throws Exception {
         String measureName = "view_item_hourly";
-        ExternalMeasure measure = createExternalMeasure(measureName);
+        GriffinMeasure griffinMeasure = createGriffinMeasure(measureName);
         given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(new ArrayList<>());
-        given(externalMeasureRepo.save(measure)).willReturn(measure);
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_SUCCESS);
-    }
+        given(griffinOp.create(griffinMeasure)).willReturn(griffinMeasure);
 
-    @Test
-    public void testCreateMeasureForExternalFailureWithBlank() throws Exception {
-        String measureName = "view_item_hourly";
-        ExternalMeasure measure = createExternalMeasure(measureName);
-        measure.setMetricName("  ");
-        given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(new ArrayList<>());
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_FAIL);
+        Measure measure = service.createMeasure(griffinMeasure);
+        assertEquals(measure.getName(), griffinMeasure.getName());
     }
 
     @Test
-    public void testCreateMeasureForExternalFailureWithException() throws Exception {
+    public void testCreateMeasureForExternalSuccess() {
         String measureName = "view_item_hourly";
-        ExternalMeasure measure = createExternalMeasure(measureName);
+        ExternalMeasure externalMeasure = createExternalMeasure(measureName);
         given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(new ArrayList<>());
-        given(externalMeasureRepo.save(measure)).willReturn(measure);
-        given(externalMeasureRepo.save(Matchers.any(ExternalMeasure.class))).willThrow(Exception.class);
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_FAIL);
+        given(externalOp.create(externalMeasure)).willReturn(externalMeasure);
+        Measure measure = service.createMeasure(externalMeasure);
+        assertEquals(measure.getName(), externalMeasure.getName());
     }
 
-    @Test
-    public void testCreateMeasureForFailureWithRepeat() throws Exception {
+    @Test(expected = GriffinException.ConflictException.class)
+    public void testCreateMeasureForFailureWithDuplicate() throws Exception {
         String measureName = "view_item_hourly";
         GriffinMeasure measure = createGriffinMeasure(measureName);
-        given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(Arrays.asList(measure));
-        GriffinOperationMessage message = service.createMeasure(measure);
-        assertEquals(message, CREATE_MEASURE_FAIL_DUPLICATE);
-    }
+        given(measureRepo.findByNameAndDeleted(measureName, false)).willReturn(Collections.singletonList(measure));
 
+        service.createMeasure(measure);
+    }
 
     @Test
     public void testUpdateMeasureForGriffinSuccess() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.updateMeasure(measure);
-        assertEquals(message, UPDATE_MEASURE_SUCCESS);
+        doNothing().when(griffinOp).update(measure);
+
+        service.updateMeasure(measure);
+        verify(griffinOp, times(1)).update(measure);
     }
 
-    @Test
+    @Test(expected = GriffinException.BadRequestException.class)
     public void testUpdateMeasureForGriffinFailureWithDiffType() throws Exception {
         Measure griffinMeasure = createGriffinMeasure("view_item_hourly");
         Measure externalMeasure = createExternalMeasure("externalName");
         given(measureRepo.findByIdAndDeleted(griffinMeasure.getId(), false)).willReturn(externalMeasure);
-        GriffinOperationMessage message = service.updateMeasure(griffinMeasure);
-        assertEquals(message, UPDATE_MEASURE_FAIL);
+
+        service.updateMeasure(griffinMeasure);
     }
 
-    @Test
-    public void testUpdateMeasureForGriffinFailureWithNotFound() throws Exception {
+    @Test(expected = GriffinException.NotFoundException.class)
+    public void testUpdateMeasureForFailureWithNotFound() throws Exception {
         Measure measure = createGriffinMeasure("view_item_hourly");
         given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(null);
-        GriffinOperationMessage message = service.updateMeasure(measure);
-        assertEquals(message, RESOURCE_NOT_FOUND);
-    }
 
-    @Test
-    public void testUpdateMeasureForGriffinFailureWithException() throws Exception {
-        Measure measure = createGriffinMeasure("view_item_hourly");
-        given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        given(measureRepo.save(Matchers.any(Measure.class))).willThrow(Exception.class);
-        GriffinOperationMessage message = service.updateMeasure(measure);
-        assertEquals(message, UPDATE_MEASURE_FAIL);
+        service.updateMeasure(measure);
     }
 
     @Test
-    public void testUpdateMeasureForExternalSuccess() throws Exception {
+    public void testUpdateMeasureForExternal() {
         ExternalMeasure measure = createExternalMeasure("external_view_item_hourly");
         given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        given(externalMeasureRepo.findOne(measure.getId())).willReturn(measure);
-        GriffinOperationMessage message = service.updateMeasure(measure);
-        assertEquals(message, UPDATE_MEASURE_SUCCESS);
-    }
-
-    @Test
-    public void testUpdateMeasureForExternalFailureWithBlank() throws Exception {
-        String measureName = "view_item_hourly";
-        ExternalMeasure measure = createExternalMeasure(measureName);
-        measure.setMetricName("  ");
-        given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        GriffinOperationMessage message = service.updateMeasure(measure);
-        assertEquals(message, UPDATE_MEASURE_FAIL);
-    }
+        doNothing().when(externalOp).update(measure);
 
-    @Test
-    public void testUpdateMeasureForExternalFailWithException() throws Exception {
-        ExternalMeasure measure = createExternalMeasure("external_view_item_hourly");
-        given(measureRepo.findByIdAndDeleted(measure.getId(), false)).willReturn(measure);
-        given(externalMeasureRepo.findOne(measure.getId())).willReturn(measure);
-        given(externalMeasureRepo.save(Matchers.any(ExternalMeasure.class))).willThrow(Exception.class);
-        GriffinOperationMessage message = service.updateMeasure(measure);
-        assertEquals(message, GriffinOperationMessage.UPDATE_MEASURE_FAIL);
+        service.updateMeasure(measure);
+        verify(externalOp, times(1)).update(measure);
     }
-
 }