OCMRealObjectForwarder.m 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2010-2015 Erik Doernenburg and contributors
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  5. * not use these files except in compliance with the License. You may obtain
  6. * a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations
  14. * under the License.
  15. */
  16. #import <objc/runtime.h>
  17. #import "OCPartialMockObject.h"
  18. #import "OCMRealObjectForwarder.h"
  19. #import "OCMFunctions.h"
  20. @implementation OCMRealObjectForwarder
  21. - (void)handleInvocation:(NSInvocation *)anInvocation
  22. {
  23. id invocationTarget = [anInvocation target];
  24. [anInvocation setSelector:OCMAliasForOriginalSelector([anInvocation selector])];
  25. if ([invocationTarget isProxy])
  26. {
  27. if (class_getInstanceMethod([invocationTarget mockObjectClass], @selector(realObject)))
  28. {
  29. // the method has been invoked on the mock, we need to change the target to the real object
  30. [anInvocation setTarget:[(OCPartialMockObject *)invocationTarget realObject]];
  31. }
  32. else
  33. {
  34. [NSException raise:NSInternalInconsistencyException
  35. format:@"Method andForwardToRealObject can only be used with partial mocks and class methods."];
  36. }
  37. }
  38. [anInvocation invoke];
  39. }
  40. @end