I’m trying to add OCMock to my iOS 4 project. To test it out, I have a class Person with one method, -hello. When I run this test:
- (void) testMock {
id mock = [OCMockObject mockForClass:[Person class]];
[[mock expect] hello];
[mock hello];
[mock verify];
}
Everything is fine, and the build succeeds. If I take away the hello call, like this:
- (void) testMock {
id mock = [OCMockObject mockForClass:[Person class]];
[[mock expect] hello];
[mock verify];
}
I’d expect to get an error message telling me that my expected method wasn’t called on the mock. Instead I get a cryptic message about the test rig crashing:
/Developer/Tools/RunPlatformUnitTests.include:451:0 Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed).
Is this crash normal when an expected method isn’t called? Do I have a bad configuration?
You don’t have a bad configuration, it’s a bug that Apple introduced in the simulator SDK when they released iOS4. Basically, if code invoked using an NSInvocation object throws an exception, then that exception is uncatchable. I wrote about the issue when it first appeared here:
http://pivotallabs.com/users/adam/blog/articles/1302-objective-c-exceptions-thrown-inside-methods-invoked-via-nsinvocation-are-uncatchable
Unfortunately, this bug affects OCMock and Apple hasn’t show much interest in fixing it. Many people have filed bug reports, but to no avail.
I realize this is little comfort, but you will get slightly better error messages when using Cedar for testing (I believe the same is true for GTM).