Newer Version Available
スタブ API を使用したモックフレームワークの作成
実行時に Apex クラスの匿名サブクラスとして作成されるスタブオブジェクトの動作を定義できます。スタブ API は System.StubProvider インターフェースと System.Test.createStub() メソッドから構成されます。
スタブ API がどのように機能するかを示す例を見てみましょう。この例は、モックフレームワークの幅広い用途を示すものではありません。Apex スタブ API の使用上のしくみに焦点を絞るために、意図的に簡潔に記述されています。
次のクラスの書式設定メソッドをテストするとします。
通常、このメソッドを呼び出すときは、今日の日付を返すメソッドがあるヘルパークラスを渡します。
次のコードは、メソッドを呼び出します。
テストでは、getFormattedDate() メソッドを切り離して、書式設定が適切に機能していることを確認したいと考えています。getTodaysDate() メソッドの戻り値は通常、日によって異なります。ただし、この例では、テストを書式設定に限定する予測可能な定数値を返すようにします。ここでは、メソッドが定数値を返すクラスの「疑似」バージョンを記述するのではなく、クラスのスタブバージョンを作成します。実行時にスタブオブジェクトが動的に作成され、そのメソッドの「スタブ」動作を指定することができます。
- System.StubProvider インターフェースを実装してスタブクラスの動作を定義します。
- System.Test.createStub() メソッドを使用してスタブオブジェクトをインスタンス化します。
- テストクラス内からスタブオブジェクトの該当するメソッドを呼び出します。
StubProvider インターフェースの実装
以下は StubProvider インターフェースの実装です。
StubProvider はコールバックインターフェースで、実装を必要とする handleMethodCall() という 1 つのメソッドを指定します。スタブメソッドがコールされると、handleMethodCall() がコールされます。このメソッドのスタブクラスの動作を定義します。このメソッドには次のパラメータがあります。
- stubbedObject: スタブオブジェクト
- stubbedMethodName: 呼び出されるメソッドの名前
- returnType: 呼び出されるメソッドの戻り値の型
- listOfParamTypes: 呼び出されるメソッドのパラメータの型のリスト
- listOfParamNames: 呼び出されるメソッドのパラメータ名のリスト
- listOfArgs: 実行時にこのメソッドに渡される実際の引数値
これらのパラメータを使用して、クラスのどのメソッドがコールされたのかを判断し、続いて各メソッドの動作を定義できます。この場合は、メソッドの戻り値の型を特定して、ハードコードされた値を返します。
クラスのスタブバージョンのインスタンス化
次のステップは、クラスのスタブバージョンをインスタンス化することです。次のユーティリティクラスは、擬似オブジェクトとして使用できるスタブオブジェクトを返します。
このクラスには、Test.createStub() メソッドを呼び出す createMock() メソッドが含まれます。createStub() メソッドは、Apex クラス種別と、以前作成した StubProvider インターフェー���のインスタンスを取ります。そして、テストで使用できるスタブオブジェクトを返します。
スタブメソッドの呼び出し
最後に、テストクラス内からスタブクラスの該当するメソッドを呼び出します。
このテストでは、createMock() メソッドをコールして、DateHelper クラスのスタブバージョンを作成します。続いて、スタブオブジェクトで getTodaysDate() メソッドを呼び出すことができます。このメソッドはハードコードされた日付を返します。ハードコードされたこの日付を使用すれば、getFormattedDate() メソッドの動作を切り離してテストできます。
Apex スタブ API の制限事項
Apex スタブ API を操作するときは次の点に注意してください。
- 模造されるオブジェクトは、Test.createStub() メソッドへのコールと同じ名前空間にある必要があります。ただし、StubProvider インターフェースの実装は別の名前空間でも構いません。
- 次の Apex 要素は模造できません。
- 静的メソッド (future メソッドを含む)
- 非公開メソッド
- プロパティ (getter および setter)
- トリガ
- 内部クラス
- システム型
- Batchable インターフェースを実装するクラス
- 非公開コンストラクタのみを持つクラス
- 戻り値の型またはパラメータの型としてイテレータは使用できません。