@Override public void run() { T value = null; Throwable error = null; boolean cancelled = false; try { value = future.get(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (CancellationException e) { cancelled = true; } catch (ExecutionException e) { error = e.getCause(); } finally { future = null; } if (cancelled) { return; } if (error != null) { observer.onError(error); } else { observer.onSuccess(value); } } }
@Override public void run() { T value = null; Throwable error = null; boolean cancelled = false; try { value = future.get(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (CancellationException e) { cancelled = true; } catch (ExecutionException e) { error = e.getCause(); } finally { future = null; } if (cancelled) { return; } if (error != null) { observer.onError(error); } else { observer.onSuccess(value); } } }
@SuppressWarnings("unchecked") @Test public void errorsShouldBePassedToObservers() throws Exception { FutureObserver observer = mock(FutureObserver.class); Callable<?> task = mock(Callable.class); Exception e = new Exception(); doThrow(e).when(task).call(); goro.schedule(task).subscribe(observer); testingQueues.executeAll(); verify(observer).onError(e); }
@SuppressWarnings("unchecked") @Test public void observersError() throws Exception { Callable<String> task = mock(Callable.class); Exception e = new Exception(); doThrow(e).when(task).call(); FutureObserver<String> observer = mock(FutureObserver.class); goro().schedule(task).subscribe(observer); doBinding(); testingQueues.executeAll(); verify(observer).onError(e); }