モック オブジェクトの動作の指定
モックを作成するときは、モックの動作を制御する、関連する 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>.ID
1138、続いて 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.ID
id = 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.findUser
n = "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