モック オブジェクトの動作の指定
モックを作成するときは、モックの動作を制御する、関連する behavior オブジェクトを作成します。このオブジェクトを使用して、モック メソッドおよびプロパティの動作 ("スタブ") を定義します。モックの作成の詳細については、モック オブジェクトの作成を参照してください。
モック オブジェクトは、スーパークラスによって指定されているインターフェイスの抽象メソッドおよびプロパティの実装です。モックはスーパークラスなしでも構築できます。その場合、モックは暗黙的なインターフェイスをもちます。
暗黙的なインターフェイスをもつモックを作成します。このインターフェイスには、Name と ID のプロパティと、識別子を受け取って名前を返す findUser メソッドが含まれます。このインターフェイスは現在実装されていませんが、これを含めてモックを作成できます。
testCase = matlab.mock.TestCase.forInteractiveUse; [mock,behaviorObj] = testCase.createMock('AddedProperties', ... {'Name','ID'},'AddedMethods',{'findUser'});
モック メソッドの動作の定義
さまざまな状況でモック メソッドが特定の値を返したり、例外をスローするように指定できます。
任意の入力で findUser メソッドが呼び出されたときに、"Unknown" を返すように指定します。既定では、findUser メソッドを呼び出すと、MATLAB® は空の配列を返します。
assignOutputsWhenメソッドは、メソッド呼び出しの戻り値を定義します。モックされたメソッド呼び出し (
behaviorObj.findUser) は、MethodCallBehaviorオブジェクトを暗黙的に作成します。MethodCallBehaviorオブジェクトのwithAnyInputsメソッドは、入力の数や値に関係なく、メソッド呼び出しにその動作が適用されることを指定します。
testCase.assignOutputsWhen(withAnyInputs(behaviorObj.findUser),"Unknown")
n = mock.findUser(1)n =
"Unknown"入力値が 1701 のときに、モック メソッドが "Jim" を返すことを指定します。この動作は、後から定義されたというだけの理由で、入力値 1701 の戻り値 "Unknown" より優先されます。
testCase.assignOutputsWhen(behaviorObj.findUser(1701),"Jim")
n = mock.findUser(1701)n =
"Jim"オブジェクトのみを入力として findUser メソッドを呼び出したときに、モック メソッドが "Unspecified ID" を返すことを指定します。MethodCallBehavior オブジェクトの withExactInputs メソッドは、このオブジェクトを唯一の入力値とするメソッド呼び出しにこの動作が適用されることを指定します。
testCase.assignOutputsWhen(withExactInputs(behaviorObj.findUser), ... "Unspecified ID") n = mock.findUser % equivalent to n = findUser(mock)
n =
"Unspecified ID"matlab.unittest.constraints 名前空間内のクラスを使用して、動作の定義に役立てることができます。5000 より大きい ID で呼び出されたときに findUser が例外をスローすることを指定します。
import matlab.unittest.constraints.IsGreaterThan
testCase.throwExceptionWhen(behaviorObj.findUser(IsGreaterThan(5000)));
n = mock.findUser(5001)Error using matlab.mock.internal.MockContext/createMockObject/mockMethodCallback (line 323) The following method call was specified to throw an exception: findUser([1×1 matlab.mock.classes.Mock], 5001)
1 つのメソッド呼び出しで要求される出力の数に基づいて動作を定義できます。メソッド呼び出しが 2 つの出力値を要求する場合は、名前として "??" を、ID として -1 を返します。
testCase.assignOutputsWhen(withNargout(2, ... withAnyInputs(behaviorObj.findUser)),"??",-1) [n,id] = mock.findUser(13)
n =
"??"
id =
-1モック プロパティの動作の定義
モック プロパティがアクセスされたときに、特定のプロパティ値または格納されたプロパティ値を返すことを指定できます。設定時に、モックがプロパティ値を格納するタイミングを指定できます。また、モック プロパティの設定またはアクセスのアクティビティに関して、テスト フレームワークが例外をスローするタイミングも定義できます。
モック プロパティの動作を定義するときは、コマンド ウィンドウにプロパティ値を表示することはプロパティ アクセス (get) の操作である点に注意してください。
モック メソッドの動作を定義する場合と同様に、モック プロパティの動作を定義するには、PropertyBehavior クラスのインスタンスが必要です。モック プロパティにアクセスすると、フレームワークはこのクラスのインスタンスを返します。アクセス動作を定義するには、PropertyGetBehavior クラスの get メソッドを呼び出すことによって PropertyBehavior のインスタンスを使用します。設定動作を定義するには、PropertySetBehavior クラスの set メソッドまたは setToValue メソッドを呼び出すことによって PropertyBehavior のインスタンスを使用します。
Name プロパティが任意の値に設定されているときに、テスト フレームワークが例外をスローすることを指定します。
throwExceptionWhenメソッドは、指定した動作に関して例外をスローするようにフレームワークに指示します。behavior オブジェクトの
PropertyBehaviorクラス (behaviorObj.Name) 上のプロパティにアクセスすると、PropertyBehaviorクラス インスタンスが作成されます。PropertyBehaviorクラスのsetメソッドを呼び出すと、PropertySetBehaviorが作成されます。
testCase.throwExceptionWhen(set(behaviorObj.Name))
mock.Name = "Sue";Error using matlab.mock.internal.MockContext/createMockObject/mockPropertySetCallback (line 368) The following property set was specified to throw an exception: <Mock>.Name = "Sue"
プロパティが "David" に設定されているときにモックに値の格納を許可します。
testCase.storeValueWhen(setToValue(behaviorObj.Name,"David")); mock.Name = "David"
mock =
Mock with properties:
Name: "David"
ID: []
繰り返しの動作と後続の動作の定義
matlab.mock.TestCase メソッドは動作の定義に便利です。しかし、代わりに matlab.mock.actions 名前空間内のクラスを使用すると、さらに多くの機能を使用できます。これらのクラスを使用すると、同じアクションを複数回繰り返す動作を定義したり、後続のアクションを指定したりできます。繰り返しまたは後続の動作を定義するには、matlab.mock.actions 名前空間内のクラスのインスタンスを、behavior クラスの when メソッドに渡します。
1138 の値を ID プロパティに代入し、プロパティ アクセスの例外をスローします。
import matlab.mock.actions.AssignOutputs import matlab.mock.actions.ThrowException when(get(behaviorObj.ID),then(AssignOutputs(1138),ThrowException)) id = mock.ID id = mock.ID
id =
1138
Error using matlab.mock.internal.MockContext/createMockObject/mockPropertyGetCallback (line 346)
The following property access was specified to throw an exception:
<Mock>.ID1138、続いて 237 の値を ID プロパティに代入します。次に、プロパティ アクセスの例外をスローします。then メソッドに対する呼び出し 1 回につき、最大 2 つのアクションが受け入れられます。後続のアクションをさらに多く指定するには、then を複数回呼び出します。
when(get(behaviorObj.ID),then(AssignOutputs(1138), ...
then(AssignOutputs(237),ThrowException)))
id = mock.ID
id = mock.ID
id = mock.IDid =
1138
id =
237
Error using matlab.mock.internal.MockContext/createMockObject/mockPropertyGetCallback (line 346)
The following property access was specified to throw an exception:
<Mock>.IDオブジェクトが唯一の入力値である場合は、関数 findUser が "Phil" の値を 2 回返すように指定します。
when(withExactInputs(behaviorObj.findUser),repeat(2,AssignOutputs("Phil")))
n = mock.findUser
n = mock.findUsern =
"Phil"
n =
"Phil"関数の 3 回目の呼び出しを行います。アクションを繰り返し、その後に then メソッドを呼び出さない場合、モックは引き続き繰り返しの値を返します。
n = mock.findUser
n =
"Phil"Name の値を設定する動作を定義します。最初の 2 回は例外をスローし、その後値を格納します。
import matlab.mock.actions.StoreValue when(set(behaviorObj.Name),then(repeat(2,ThrowException),StoreValue)) mock.Name = "John"
Error using matlab.mock.internal.MockContext/createMockObject/mockPropertySetCallback (line 368)
The following property set was specified to throw an exception:
<Mock>.Name = "John"mock.Name = "Penny"Error using matlab.mock.internal.MockContext/createMockObject/mockPropertySetCallback (line 368)
The following property set was specified to throw an exception:
<Mock>.Name = "Penny"mock.Name = "Tommy"mock =
Mock with properties:
Name: "Tommy"動作のまとめ
| 動作 | TestCase メソッド | matlab.mock.Actions クラス (繰り返しおよび後続の動作の定義が可能) |
|---|---|---|
| メソッド呼び出しおよびプロパティ アクセスに指定された値を返す。 | assignOutputsWhen | AssignOutputs |
| プロパティがアクセスされたときに格納された値を返す。 | returnStoredValueWhen | ReturnStoredValue |
| プロパティが設定されたときに値を格納する。 | storeValueWhen | StoreValue |
| メソッドが呼び出されたとき、またはプロパティが設定またはアクセスされたときに例外をスローする。 | throwExceptionWhen | ThrowException |
参考
クラス
matlab.mock.TestCase|matlab.mock.actions.AssignOutputs|matlab.mock.actions.DoNothing|matlab.mock.actions.Invoke|matlab.mock.actions.ReturnStoredValue|matlab.mock.actions.StoreValue|matlab.mock.actions.ThrowException