Objective-Cのテストクラスからプライベートメソッド/プロパティを参照したい

この記事は投稿日から1年以上が経過しています。

dkfjさんが Objective-Cで、プライベートメソッド・プロパティにアクセスし、ユニットテストを実行する方法 という記事を書かれていました。

せっかくなので私がやっている方法も書かせていただきます。

テスト対象のクラス

以下のようにプライベートメソッドとプロパティを持ったExampleClassをテストするとします。

#import "ExampleClass.h"

@interface ExampleClass()
- (BOOL)privateMethod;
@property (assign) BOOL flag;
@end

@implementation ExampleClass

- (BOOL)privateMethod
{
  return self.flag;
}

@end

テストクラス

自分の場合は、こんなかんじでテストクラスでテスト対象のプライベートメソッドやプロパティを宣言し直して使ってます。

#import <GHUnitIOS/GHUnit.h> 
#import "ExampleClass.h"

@interface ExampleClass (Private)
- (BOOL)privateMethod;
@property (assign) BOOL flag;
@end

@interface ExsampleClassTest : GHTestCase
@end

@implementation ExsampleClassTest

- (void)testPrivateMethod
{
  ExampleClass* example = [ExampleClass new];
  GHAssertFalse([example privateMethod], nil);
  example.flag = YES;
  GHAssertTrue([example privateMethod], nil);
}

@end

メリットとデメリット

メリット

  • プライベートメソッドを(テストクラス以外からは)プライベートなまま保てる

デメリット

  • 本体のほうのメソッドが変わったらテストクラスのほうの宣言も書き直す必要がある

所の執筆・監修した書籍

iOS 11 Programming

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川 克己,所 友太,永野 哲久,加藤 寛人,
  • 製本版,電子版
  • PEAKSで購入する