以前、method_exchangeImplementationsによるクラスメソッドの置換の仕方を紹介しましたが、
OCMockで2.1からクラスメソッドのモッキングが出来るようになっていたので紹介します。
ユニットテストでの利用としてはこちらの方がやりやすいです。
使い方は、OCMockのインスタンスメソッドのモッキングのやり方と一緒。
この例ではNSFileManagerのdefaultManagerを置換しています。
- (void)testSome {
id fileManager = [[OCMockObject mockForClass:[NSFileManager class]];
[[[fileManager stub] andReturn:fileManager] defaultManager];
// お試し
[[fileManager expect] createFileAtPath:nil contents:nil attributes:nil];
[[NSFileManager defaultManager] createFileAtPath:nil contents:nil attributes:nil];
[fileManager verify];
}
置換をしたいクラスメソッドと同名のインスタンスメソッドが定義されている場合は、クラスメソッドを置換しようとしている事を伝える必要があります。
- (void)testSome {
id fileManager = [[OCMockObject mockForClass:[NSFileManager class]];
[[[[fileManager stub] classMethod] andReturn:fileManager] defaultManager];
}
停止の仕方は以下
- (void)testSome {
...
[fileManager stopMocking];
}
method_swizzlingしなくても良くなったので楽になりました。