2012年8月13日月曜日

Objective-Cでprivateなインスタンス変数を外部から変更したり参照する方法

UnitTestなどでテスト対象のクラスのprivateな変数(属性)を参照したり変更したりしたい場合があります。
テストのためにアクセッサを追加したりするのはちょっとあれなので何かいい方法がないか調べてみたらObjective-Cだとテストフレームワークの力を借りるまでもなくあっさりできますね・・

Objective-CのKey Value Codingを利用します。

これはざっくり言うとアクセッサーを用意しなくても、
 setValue: forKeyとvalueForKeyを使えば、名前(Key)でクラスの変数にアクセスできるという代物です。

テスト対象はこのPersonというクラス。(メソッド名がひどいのは無視しましょう)


@interface Person : NSObject
{
@private
    NSString* name;
}

- (NSString*)getName;
@end

@implementation Person

- (NSString*)getName {
    return name;
}

@end

テストコードはこのようになります。

- (void)testName {
    Person * person = [[Person alloc] init];
    
    [person setValue:@"Taro" forKey:@"name"];
    
    GHAssertEqualStrings(@"Taro", [person getName], @"not equeal name");
}


0 件のコメント:

コメントを投稿