try {
Method delegateMethod = getDelegateMethod(mockMethod);
if (!compatibleReturnTypes(mockMethod.getReturnType(), delegateMethod.getReturnType())) {
new Reporter().delegatedMethodHasWrongReturnType(mockMethod, delegateMethod, invocation.getMock(), delegatedObject);
}
result = delegateMethod.invoke(delegatedObject, invocation.getArguments());
} catch (NoSuchMethodException e) {
new Reporter().delegatedMethodDoesNotExistOnDelegate(mockMethod, invocation.getMock(), delegatedObject);
} catch (InvocationTargetException e) {
// propagate the original exception from the delegate
throw e.getCause();
}