hachinoBlog

hachinobuのエンジニアライフ

OCMockのスタブでメソッドでなくプロパティの返り値を制御する方法

テストケースを書く際にOCMockのスタブを使用してメソッドの返り値を制御することが多々あると思います。
メソッドだけじゃなくて、そのクラスで定義されているプロパティの返り値を制御するのに四苦八苦したのでメモります。
メソッドのスタブと同じように書いて実行するとエラーになります。
やり方は

//OCMock対象クラス
Sample.h
@interface Sample : NSObject

@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * lastName;

@end

//テストケースクラス
Test.m

//Test.m内にSampleクラスのカテゴリを作ってしまう
@interface Sample (OCMockTest)

- (NSString *)firstName;
- (NSString *)lastName;

@end

@implementation Sample (OCMockTest)

- (NSString *)firstName
{
    return [self firstName];
}

- (NSString *)lastName
{
    return [self lastName];
}

@end

@implementation Test.m
- (void)ocmockTest
{
    id sampleMock = [OCMockObject mockForClass:[Sample class]];
    [(Sample *)[[sampleMock stub] andReturn:@"Ichiro"] firstName];
    [(Sample *)[[sampleMock stub] andReturn:@"Suzuki"] firstName];
}

ようはテストケースクラス内でモック利用したいクラスのカテゴリをつくって
そこにプロパティと同じ名前のメソッドを定義してあげることであたかもプロパティにアクセスしたときの返り値を
制御できるようにしているということです。