OCMockの使い方

使い方

mock objectの生成

クラスオブジェクトから生成

空(メソッドがない)のmockオブジェクト生成
mockは定義していないメソッドを呼ぶと例外が発生する

id mock = [OCMockObject makeForClass:[NSString class]];
定義していないメソッドを読んでも例外が発生しない
id mock = [OCMockObject niceMockForClass:[NSString class]];
インスタンスオブジェクトから生成
id aMock = [OCMockObject partialMockForObject:[NSString stringWithString:@"foo"]];
プロトコルモック
id mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
observerモック
id mock = [OCMockObject observerMock]

stubの作成

id mock = [OCMockObject mockForClass:[NSString class]];
[[mock stub] lowercaseString];

呼ばれたことを検証する

id mock = [OCMockObject mockForClass:[NSString class]];
[[mock expect] lowercaseString];

// [mock lowercaseString];

[mock verify]; // exception throw
呼ばれた順庵も検証
[mock setExpectationOrderMatters:YES];

[[mock expect] lowercaseString];
[[mock expect] uppercaseString];

戻り値を指定

任意のオブジェクトを指定
[[[mock stub] andRetugn:@"ret"] lowercaseString];
プリミティブ型

OCMOCK_VALUE(1)とやるとエラーになる

int expectedValue = 1;
[[[mock stub] andRetugnValue:OCMOCK_VALUE(expectedValue)] lenght];

引数の指定

固定オブジェクト
[[mock stub] hasSuffix:@"foo"];
任意のオブジェクト
[[mock stub] hasSuffix:[OCMArg any]];
[[mock stub] hasSuffix:OCMOCK_ANY];
可変長引数
[[mock stub] hasSuffix:@"foo"];
参照の指定
[[mock expect] completePathIntoString:[OCMArg setTo:expectedName] caseSensitive:YES 
                         matchesIntoArray:[OCMArg setTo:expectedArray] filterTypes:OCMOCK_ANY];
Nilチェック
[[mock expect] someMethod:[OCMArg isNil]]
[[mock expect] someMethod:[OCMArg isNotNil]]
オブジェクトチェック
NSString* aValue = @"bar";
[[mock expect] someMethod:[OCMArg isNotEqual:aValue]];

// selector
[[mock expect] someMethod:[OCMArg checkWithSelector:aSelector onObject:anObject]];

// block
[[mock stub] hasSuffix:[OCMArg checkWithBlock:^(id value) { return [value isEqualToString:@"foo"]; }]];

処理内容の指定

例外
NSException *exception = [NSException exceptionWithName:@"TestException" reason:@"test" userInfo:nil];
[[[mock expect] andThrow:exception] lowercaseString];

niceMockForClassにおける例外処理登録

id mock = [OCMockObject niceMockForClass:[NSString class]];

[[mock reject] uppercaseString];
通知
NSNotification *notification = [NSNotification notificationWithName:TestNotification object:self];
[[[mock stub] andPost:notification] lowercaseString];
特定の処理を呼ぶ
// selectorを使うやり方
// 
// 自分のクラスに定義済み
// - (NSString *)valueForString:(NSString *)aString andMask:(NSStringCompareOptions)mask
///
[[[mock stub] andCall:@selector(valueForString:andMask:) onObject:self] commonPrefixWithString:@"FOO" options:NSCaseInsensitiveSearch];


// ブロックを使うやり方
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) {
    NSString *value;
    [invocation getArgument:&value atIndex:2];
    value = [NSString stringWithFormat:@"MOCK %@", value];
    [invocation setReturnValue:&value];
};

[[[mock stub] andDo:theBlock] stringByAppendingString:[OCMArg any]];
オリジナルの処理を実行

ただしpartialMockForObjectで生成した場合のみ

[[[mock expect] andForwardToRealObject] method2];

できないこと

クラスメソッドの追加

0 件のコメント:

コメントを投稿

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...