@Test
  public void testGetAnalysis()
      throws Exception {
    try {
      // Setup analytic job
      final AnalyticJob analyticJob = new AnalyticJob().
          setAppId(TEST_JOB_ID1).setAppType(new ApplicationType(TEST_APP_TYPE)).
          setFinishTime(1462178403).setStartTime(1462178412).setName(TEST_JOB_NAME).
          setQueueName(TEST_DEFAULT_QUEUE_NAME).setUser(TEST_USERNAME).setTrackingUrl(TEST_TRACKING_URL);

      // Setup job counter data
      String filePath = FILENAME_JOBCOUNTER;
      MapReduceCounterData jobCounter = new MapReduceCounterData();
      setCounterData(jobCounter, filePath);

      // Setup mapper data
      long[][] mapperTasksTime = {{2563, 0, 0, 0, 0}, {2562, 0, 0, 0, 0}, {2567, 0, 0, 0, 0}};
      MapReduceTaskData[] mappers = new MapReduceTaskData[3];
      for (int i = 1; i <= mappers.length; i++) {
        MapReduceCounterData taskCounter = new MapReduceCounterData();
        setCounterData(taskCounter, FILENAME_MAPPERTASK.replaceFirst("\\$", Integer.toString(i)));
        mappers[i - 1 ] = new MapReduceTaskData("task-id-"+(i-1), "task-attempt-id-"+(i-1));
        mappers[i - 1].setTimeAndCounter(mapperTasksTime[i - 1], taskCounter);
      }

      // Setup reducer data
      long[][] reducerTasksTime = {{1870, 1665, 14, 0, 0}};
      MapReduceTaskData[] reducers = new MapReduceTaskData[1];
      for (int i = 1; i <= reducers.length; i++) {
        MapReduceCounterData taskCounter = new MapReduceCounterData();
        setCounterData(taskCounter, FILENAME_REDUCERTASK.replaceFirst("\\$", Integer.toString(i)));
        reducers[i - 1] = new MapReduceTaskData("task-id-"+(i-1), "task-attempt-id-"+(i-1));
        reducers[i - 1].setTimeAndCounter(reducerTasksTime[i - 1], taskCounter);
      }

      // Setup job configuration data
      filePath = FILENAME_JOBCONF;
      Properties jobConf = TestUtil.loadProperties(filePath);

      // Setup application data
      final MapReduceApplicationData data = new MapReduceApplicationData().setCounters(jobCounter).
          setMapperData(mappers).setReducerData(reducers).setJobConf(jobConf).setSucceeded(true).
          setDiagnosticInfo("").setUsername(TEST_USERNAME).setUrl("").setJobName(TEST_JOB_NAME).
          setStartTime(1462178412).setFinishTime(1462178403).setRetry(false).setAppId(TEST_JOB_ID1);

      // Setup heuristics
      final List<Heuristic> heuristics = loadHeuristics();

      // Setup job type
      final JobType jobType = new JobType(TEST_JOB_TYPE, TEST_JOBCONF_NAME, TEST_JOBCONF_PATTERN);

      // Set expectations in JMockit
      new Expectations() {{
        fetcher.fetchData(analyticJob);
        result = data;

        elephantContext.getHeuristicsForApplicationType(analyticJob.getAppType());
        result = heuristics;

        elephantContext.matchJobType(data);
        result = jobType;
      }};

      // Call the method under test
      AppResult result = analyticJob.getAnalysis();

      // Make assertions on result
      assertTrue("Result is null", result != null);
      assertTrue("Score did not match", result.score == TEST_SCORE);
      assertTrue("Severity did not match", result.severity.toString().equals(TEST_SEVERITY));
      assertTrue("APP ID did not match", result.id.equals(TEST_JOB_ID1));
      assertTrue("Scheduler did not match", result.scheduler.equals(TEST_SCHEDULER));
    } catch (Exception e) {
      e.printStackTrace();
      assertFalse("Test failed with exception", true);
    }
  }
Test aims to exercise {@code getAnalysis()} method in {@code AnalyticJob}.<br>
Dependencies to {@code ElephantContext, ElephantFetcher and Heuristics} are mocked
out with JMockit.
test/com/linkedin/drelephant/analysis/AnalyticJobTest.java