LoginSignup
17
16

More than 5 years have passed since last update.

OCMockによるクラスメソッドの置換

Posted at

以前、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しなくても良くなったので楽になりました。

17
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
16