protected abstract void heartbeat() throws Exception;
@Test(timeout = 2000)
  public void testRMContainerAllocatorExceptionIsHandled() throws Exception {
    ClientService mockClientService = mock(ClientService.class);
    AppContext mockContext = mock(AppContext.class);
    MockRMCommunicator mockRMCommunicator =
        new MockRMCommunicator(mockClientService, mockContext);
    RMCommunicator communicator = spy(mockRMCommunicator);
    Clock mockClock = mock(Clock.class);
    when(mockContext.getClock()).thenReturn(mockClock);

    doThrow(new RMContainerAllocationException("Test")).doNothing()
        .when(communicator).heartbeat();

    when(mockClock.getTime()).thenReturn(1L).thenThrow(new AssertionError(
        "GetClock called second time, when it should not have since the " +
        "thread should have quit"));

    AllocatorRunnable testRunnable = communicator.new AllocatorRunnable();
    testRunnable.run();
  }