別のインスタンスを提供してメソッドをインターセプトすることはできないため、クラス メソッドに対してできることは、別のクラスを提供することです。このようなもの:
+ (Class)paymentQueueClass
{
return [SKPaymentQueue class];
}
コールポイントは次のようになります。
Class paymentQueueClass = [[self class] paymentQueueClass];
if ([paymentQueueClass canMakePayments])
...
これにより、「テスト シーム」または制御ポイントが導入され、 以外のクラスを指定できるようになりますSKPaymentQueue
。では、次のように置き換えてみましょう。
static BOOL fakeCanMakePayments;
@interface FakePaymentQueue : SKPaymentQueue
@end
@implementation FakePaymentQueue
+ (void)setFakeCanMakePayments:(BOOL)fakeValue
{
fakeCanMakePayments = fakeValue;
}
+ (BOOL)canMakePayments
{
return fakeCanMakePayments;
}
@end
厳密に言えば、これは「モック オブジェクト」ではなく、「フェイク オブジェクト」です。違いは、モック オブジェクトが呼び出された方法を検証することです。偽のオブジェクトは、スタブ化された結果を提供するだけです。
次に、テストしたい元のクラスのテスト用サブクラスを作成しましょう。
@interface TestingSubclass : OriginalClass
@end
@implementation TestingSubclass
+ (Class)paymentQueueClass
{
return [FakePaymentQueue class];
}
@end
ご覧のとおり、これは に置き換えSKPaymentQueue
られFakePaymentQueue
ます。テストを に対して実行できるようになりましたTestingSubclass
。