2013年4月18日木曜日

UnitTestで、テストするクラスのプライベートなメソッドを呼ぶ方法

TestCaseでプライベートなメソッドが呼べない

XcodeでUnitTestをする際、テスト対象クラスの.hファイルに宣言していないメソッド、いわゆるプライベートメソッドをテストしたくなります。 むしろ、そいつらを重点的にテストしたい!
でも、TestCaseクラスに、テスト対象クラスの.hファイルをimportしただけだと、コンパイルエラーになって呼べません。

しょうがないから.hにプライベートなメソッドの宣言も書いとくか〜
でも、余計なメソッドを外部に公開したくないしな〜
とか考えてたんですが、ソースを汚さない良い解決方法がありました。



TestCaseでプライベートなメソッドを呼ぶ方法

TestCaseクラスの.mファイルで、テスト対象クラスのカテゴリを定義して、その中に使いたいプライベートメソッドを宣言してやります。
すると、問題なく呼び出せるようになりました。

#import "MyClassTests.h"
#import "MyClass.h"

// MyClass.hに宣言してないメソッドのカテゴリ
@interface MyClass (Test)
- (void)privateMethod; // MyClass.hに宣言してないメソッド
@end

/// MyClassのテスト
@implementation MyClassTests

/// privateMethodのテスト
- (void)testPrivateMethod
{
  MyClass* obj = [[MyClass alloc] init];
  [obj privateMethod]; // エラーにならない!

  ...
}

@end

Objective-Cの特徴を活かした解決方法ですね。

0 件のコメント: