Main Content

モック オブジェクトの動作の指定

モックを作成するときは、モックの動作を制御する、関連する behavior オブジェクトを作成します。このオブジェクトを使用して、モック メソッドおよびプロパティの動作 ("スタブ") を定義します。モックの作成の詳細については、モック オブジェクトの作成を参照してください。

モック オブジェクトは、スーパークラスによって指定されているインターフェイスの抽象メソッドおよびプロパティの実装です。モックはスーパークラスなしでも構築できます。その場合、モックは暗黙的なインターフェイスをもちます。

暗黙的なインターフェイスをもつモックを作成します。このインターフェイスには、NameID のプロパティと、識別子を受け取って名前を返す 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 クラス (繰り返しおよび後続の動作の定義が可能)
メソッド呼び出しおよびプロパティ アクセスに指定された値を返す。assignOutputsWhenAssignOutputs
プロパティがアクセスされたときに格納された値を返す。returnStoredValueWhenReturnStoredValue
プロパティが設定されたときに値を格納する。storeValueWhenStoreValue
メソッドが呼び出されたとき、またはプロパティが設定またはアクセスされたときに例外をスローする。throwExceptionWhenThrowException

参考

クラス

関連するトピック