モック オブジェクトの相互作用の検定
モックを作成するときは、モックの動作を制御する、関連する behavior オブジェクトを作成します。このオブジェクトを使用して、テスト対象のコンポーネントからモック オブジェクトへ送信された、傍受されたメッセージにアクセスします ("スパイ" と呼ばれる処理)。モックの作成の詳細については、モック オブジェクトの作成を参照してください。
モッキング フレームワークでは、検定とは、オブジェクトとの相互作用をテストする機能のことです。検定には次の 4 種類があります。
検証 — 例外をスローせずにエラーを生成して記録します。検証では例外がスローされないため、すべてのテスト内容は検証エラーが発生しても最後まで実行されます。通常の場合、検証はテストを早期終了する必要がないため、ユニット テストの主な検定となります。前提条件の違反や不適切なテスト設定がないかどうかをテストするには、他の検定タイプを使用します。
仮定 — テスト環境がテスト エラーを回避するために必要な前提条件を満たしていることを確認します。仮定エラーが発生するとテストのフィルター処理が行われ、テスト フレームワークによってテストが Incomplete としてマークされます。
アサーション — エラー条件によって現在のテスト内容の残りが無効になっても、それ以降のテスト メソッドは正しく実行されることを確認します。アサーション地点におけるエラーによって、現在のテスト メソッドが失敗し不完全となります。
致命的なアサーション — エラーが発生した場合にテスト セッションを中止します。これらの検定は、エラー モードがあまりに根本的なものであり、テストを続行する意義がない場合に役立ちます。また、フィクスチャの破棄で MATLAB® の状態が正しく復元されず、テストを中止して新しいセッションを開始する方が望ましい場合にも有益です。
モック オブジェクトは、スーパークラスによって指定されているインターフェイスの抽象メソッドおよびプロパティの実装です。モックはスーパークラスなしでも構築できます。その場合、モックは暗黙的なインターフェイスをもちます。サイコロのクラスに関して、暗黙的なインターフェイスをもつモックを作成します。インターフェイスには、Color と NumSides のプロパティ、およびサイコロの数を受け取って値を返す roll メソッドが含まれます。このインターフェイスは現在実装されていませんが、これを含めてモックを作成できます。
testCase = matlab.mock.TestCase.forInteractiveUse; [mock,behaviorObj] = testCase.createMock('AddedProperties', ... {'NumSides','Color'},'AddedMethods',{'roll'});
モック メソッドの相互作用の検定
モックは自身に送信された相互作用を記録するため、モック メソッドが呼び出されたことを検定できます。1 つのサイコロを転がします。
val = mock.roll(1);
roll メソッドが 1 つのサイコロで呼び出されたことを検証します。
testCase.verifyCalled(behaviorObj.roll(1))
Interactive verification passed.
roll メソッドが 3 つのサイコロで呼び出されたことを検証します。このテストは失敗します。
testCase.verifyCalled(behaviorObj.roll(3), ... 'roll method should have been called with input 3.')
Interactive verification failed.
----------------
Test Diagnostic:
----------------
roll method should have been called with input 3.
---------------------
Framework Diagnostic:
---------------------
verifyCalled failed.
--> Method 'roll' was not called with the specified signature.
--> Observed method call(s) with any signature:
out = roll([1×1 matlab.mock.classes.Mock], 1)
Specified method call:
MethodCallBehavior
[...] = roll(<Mock>, 3)roll メソッドが 2 つのサイコロで呼び出されていないことを検証します。
testCase.verifyNotCalled(behaviorObj.roll(2))
Interactive verification passed.
MethodCallBehavior クラスの withAnyInputs、withExactInputs および withNargout の各メソッドが MethodCallBehavior オブジェクトを返すため、これらを検定に使用できます。roll メソッドが少なくとも 1 回、任意の入力で呼び出されたことを検証します。
testCase.verifyCalled(withAnyInputs(behaviorObj.roll))
Interactive verification passed.
roll メソッドが 2 つの出力および任意の入力で呼び出されていないことを検証します。
testCase.verifyNotCalled(withNargout(2,withAnyInputs(behaviorObj.roll)))
Interactive verification passed.
モック プロパティの相互作用の検定
メソッド呼び出しと同様に、モックはプロパティの設定およびアクセスの操作を記録します。サイコロの色を設定します。
mock.Color = "red"mock =
Mock with properties:
NumSides: []
Color: "red"色が設定されたことを検証します。
testCase.verifySet(behaviorObj.Color)
Interactive verification passed.
色がアクセスされたことを検証します。MATLAB がオブジェクトを表示するときに暗黙的なプロパティ アクセスがあるため、このテストは成功します。
testCase.verifyAccessed(behaviorObj.Color)
Interactive verification passed.
面の数が設定されていないことをアサートします。
testCase.assertNotSet(behaviorObj.NumSides)
Interactive assertion passed.
モック オブジェクトの制約の使用
matlab.mock.TestCase メソッドは、モックの相互作用をスパイするのに便利です。しかし、代わりに matlab.mock.constraints 名前空間内のクラスを使用すると、さらに多くの機能を使用できます。制約を使用するには、behavior オブジェクトと制約を、verifyThat、assumeThat、assertThat、fatalAssertThat のいずれかのメソッドに渡します。
新しいモック オブジェクトを作成します。
testCase = matlab.mock.TestCase.forInteractiveUse; [mock,behaviorObj] = testCase.createMock('AddedProperties', ... {'NumSides','Color'},'AddedMethods',{'roll'});
2 つのサイコロを転がします。次に、制約を使用して、roll メソッドが少なくとも 1 回、2 つのサイコロで呼び出されたことを検証します。
val = mock.roll(2);
import matlab.mock.constraints.WasCalled
testCase.verifyThat(behaviorObj.roll(2),WasCalled)Interactive verification passed.
1 つのサイコロを転がします。次に、roll メソッドが少なくとも 2 回、任意の入力で呼び出されたことを検証します。
val = mock.roll(1); testCase.verifyThat(withAnyInputs(behaviorObj.roll), ... WasCalled('WithCount',2))
Interactive verification passed.
NumSides がアクセスされていないことを検証します。
import matlab.mock.constraints.WasAccessed
testCase.verifyThat(behaviorObj.NumSides,~WasAccessed)Interactive verification passed.
サイコロの色を設定します。次に、プロパティが 1 回設定されたことを検証します。
mock.Color = "blue"; import matlab.mock.constraints.WasSet testCase.verifyThat(behaviorObj.Color,WasSet('WithCount',1))
Interactive verification passed.
Color プロパティにアクセスします。次に、アクセス回数が厳密に 1 回ではないことを検証します。このテストは失敗します。
c = mock.Color
testCase.verifyThat(behaviorObj.Color,~WasAccessed('WithCount',1))c =
"blue"
Interactive verification failed.
---------------------
Framework Diagnostic:
---------------------
Negated WasAccessed failed.
--> Property 'Color' was accessed the prohibited number of times.
Actual property access count:
1
Prohibited property access count:
1
Specified property access:
PropertyGetBehavior
<Mock>.Color面の数を設定します。次に、面の数が 22 に設定されたことを検証します。
mock.NumSides = 22;
testCase.verifyThat(behaviorObj.NumSides,WasSet('ToValue',22))Interactive verification passed.
matlab.unittest.constraints 名前空間の制約を使用して、サイコロの面の数が 20 より大きい数に設定されていないことをアサートします。このテストは失敗します。
import matlab.unittest.constraints.IsLessThanOrEqualTo testCase.verifyThat(behaviorObj.NumSides, ... WasSet('ToValue',IsLessThanOrEqualTo(20)))
Interactive verification failed.
---------------------
Framework Diagnostic:
---------------------
WasSet failed.
--> Property 'NumSides' was not set to the specified value.
--> Observed property set(s) to any value:
<Mock>.NumSides = 22
Specified property set:
PropertySetBehavior
<Mock>.NumSides = <IsLessThanOrEqualTo constraint>検定のまとめ
| 検定の種類 | TestCase メソッド | matlab.mock.constraints クラス | |
|---|---|---|---|
matlab.unittest.TestCase メソッドを使用 | matlab.mock.constraints クラスを使用 | ||
| メソッドが呼び出された | verifyCalled または verifyNotCalled | verifyThat | WasCalled または Occurred |
assumeCalled または assumeNotCalled | assumeThat | ||
assertCalled または assertNotCalled | assertThat | ||
fatalAssertCalled または fatalAssertNotCalled | fatalAssertThat | ||
| メソッドが特定の回数呼び出された | 該当なし | verifyThat、assumeThat、assertThat または fatalAssertThat | WasCalled |
| プロパティがアクセスされた | verifyAccessed または verifyNotAccessed | verifyThat | WasAccessed または Occurred |
assumeAccessed または assumeNotAccessed | assumeThat | ||
assertAccessed または assertNotAccessed | assertThat | ||
fatalAssertAccessed または fatalAssertNotAccessed | fatalAssertThat | ||
| プロパティが特定の回数アクセスされた | 該当なし | verifyThat、assumeThat、assertThat または fatalAssertThat | WasAccessed |
| プロパティが設定された | verifySet または verifyNotSet | verifyThat | WasSet または Occurred |
assumeSet または assumeNotSet | assumeThat | ||
assertSet または assertNotSet | assertThat | ||
fatalAssertSet または fatalAssertNotSet | fatalAssertThat | ||
| プロパティが特定の回数設定された | 該当なし | verifyThat、assumeThat、assertThat または fatalAssertThat | WasSet |
| プロパティが特定の値に設定された | 該当なし | verifyThat、assumeThat、assertThat または fatalAssertThat | WasSet または Occurred |
| メソッドが呼び出され、プロパティが特定の順序でアクセスまたは設定された | 該当なし | verifyThat、assumeThat、assertThat または fatalAssertThat | Occurred |