diff --git a/Source/OCMock/OCClassMockObject.m b/Source/OCMock/OCClassMockObject.m index 867082d0..bb473f28 100644 --- a/Source/OCMock/OCClassMockObject.m +++ b/Source/OCMock/OCClassMockObject.m @@ -118,7 +118,8 @@ - (void)prepareClassForClassMethodMocking IMP myForwardIMP = method_getImplementation(myForwardMethod); class_addMethod(newMetaClass, @selector(forwardInvocation:), myForwardIMP, method_getTypeEncoding(myForwardMethod)); - + if (self->verifyAfterRunDisabled) + return; /* adding forwarder for most class methods (instance methods on meta class) to allow for verify after run */ NSArray *methodBlackList = @[@"class", @"forwardingTargetForSelector:", @"methodSignatureForSelector:", @"forwardInvocation:", @"isBlock", @"instanceMethodForwarderForSelector:", @"instanceMethodSignatureForSelector:"]; diff --git a/Source/OCMock/OCMockObject.h b/Source/OCMock/OCMockObject.h index 31f7ac41..a831b9e1 100644 --- a/Source/OCMock/OCMockObject.h +++ b/Source/OCMock/OCMockObject.h @@ -27,6 +27,7 @@ { BOOL isNice; BOOL expectationOrderMatters; + BOOL verifyAfterRunDisabled; NSMutableArray *stubs; NSMutableArray *expectations; NSMutableArray *exceptions; @@ -42,6 +43,9 @@ + (id)observerMock; ++ (BOOL)verifyAfterRunDisabledForNewMocks; ++ (void)setVerifyAfterRunDisabledForNewMocks:(BOOL)flag; + - (instancetype)init; - (void)setExpectationOrderMatters:(BOOL)flag; diff --git a/Source/OCMock/OCMockObject.m b/Source/OCMock/OCMockObject.m index 556a7ac3..f879bb93 100644 --- a/Source/OCMock/OCMockObject.m +++ b/Source/OCMock/OCMockObject.m @@ -33,6 +33,8 @@ @implementation OCMockObject +static BOOL globalVerifyAfterRunDisabled; + #pragma mark Class initialisation + (void)initialize @@ -83,12 +85,23 @@ + (id)observerMock return [[[OCObserverMockObject alloc] init] autorelease]; } ++ (BOOL)verifyAfterRunDisabledForNewMocks +{ + return globalVerifyAfterRunDisabled; +} + ++ (void)setVerifyAfterRunDisabledForNewMocks:(BOOL)flag +{ + globalVerifyAfterRunDisabled = flag; +} + #pragma mark Initialisers, description, accessors, etc. - (instancetype)init { // no [super init], we're inheriting from NSProxy + verifyAfterRunDisabled = globalVerifyAfterRunDisabled; expectationOrderMatters = NO; stubs = [[NSMutableArray alloc] init]; expectations = [[NSMutableArray alloc] init]; @@ -218,6 +231,10 @@ - (void)verifyInvocation:(OCMInvocationMatcher *)matcher - (void)verifyInvocation:(OCMInvocationMatcher *)matcher atLocation:(OCMLocation *)location { + if (self->verifyAfterRunDisabled) { + OCMReportFailure(location, [NSString stringWithFormat:@"%@: Verify after run was disabled", [self description]]); + return; + } for(NSInvocation *invocation in invocations) { if([matcher matchesInvocation:invocation]) diff --git a/Source/OCMock/OCPartialMockObject.m b/Source/OCMock/OCPartialMockObject.m index 7bce03db..34420c21 100644 --- a/Source/OCMock/OCPartialMockObject.m +++ b/Source/OCMock/OCPartialMockObject.m @@ -127,6 +127,8 @@ - (void)prepareObjectForInstanceMethodMocking IMP myObjectClassImp = method_getImplementation(myObjectClassMethod); class_addMethod(subclass, @selector(class), myObjectClassImp, objectClassTypes); + if (self->verifyAfterRunDisabled) + return; /* Adding forwarder for most instance methods to allow for verify after run */ NSArray *methodBlackList = @[@"class", @"forwardingTargetForSelector:", @"methodSignatureForSelector:", @"forwardInvocation:", @"allowsWeakReference", @"retainWeakReference", @"isBlock"]; diff --git a/Source/OCMockTests/OCMockObjectVerifyAfterRunTests.m b/Source/OCMockTests/OCMockObjectVerifyAfterRunTests.m index bc17fd46..04852bee 100644 --- a/Source/OCMockTests/OCMockObjectVerifyAfterRunTests.m +++ b/Source/OCMockTests/OCMockObjectVerifyAfterRunTests.m @@ -114,7 +114,30 @@ - (void)testThrowsWhenClassMethodWasNotInvoked { id mock = [OCMockObject niceMockForClass:[TestBaseClassForVerifyAfterRun class]]; - XCTAssertThrows([[mock verify] classMethod1], @"Should not have thrown an exception for class method that was called."); + XCTAssertThrows([[mock verify] classMethod1], @"Should have thrown an exception for class method that was called."); +} + +- (void)testThrowsWhenClassMethodWasInvokedOnMockWithDisabledVerifyAfterRun +{ + [OCMockObject setVerifyAfterRunDisabledForNewMocks:YES]; + id mock = [OCMockObject niceMockForClass:[NSString class]]; + [OCMockObject setVerifyAfterRunDisabledForNewMocks:NO]; + + [mock lowercaseString]; + + XCTAssertThrows([[mock verify] lowercaseString], @"Should have thrown an exception due to disabled verify after run"); +} + +- (void)testThrowWhenMethodWasInvokedOnPartialMockWithDisabledVerifyAfterRun +{ + [OCMockObject setVerifyAfterRunDisabledForNewMocks:YES]; + TestClassForVerifyAfterRun *testObject = [[TestClassForVerifyAfterRun alloc] init]; + id mock = [OCMockObject partialMockForObject:testObject]; + [OCMockObject setVerifyAfterRunDisabledForNewMocks:NO]; + + [mock method2]; + + XCTAssertThrows([[mock verify] method2], @"Should have thrown an exception due to disabled verify after run"); } @end