Main Content

指定 Mock 对象行为

当您创建 mock 时,还会创建一个用于控制 mock 行为的关联行为对象。使用此对象可定义 mock 方法和属性的行为 (stub)。有关创建 mock 的详细信息,请参阅创建 Mock 对象

mock 对象是超类所指定接口的抽象方法和属性的实现。您也可以在没有超类的情况下构造 mock,在这种情况下,mock 具有一个隐式接口。

创建一个具有隐式接口的 mock。该接口包含 NameID 属性以及 findUser 方法,后者接受标识符并返回名称。虽然该接口当前未实现,但您可以创建一个具有该接口的 mock。

testCase = matlab.mock.TestCase.forInteractiveUse;
[mock,behaviorObj] = testCase.createMock('AddedProperties', ...
    {'Name','ID'},'AddedMethods',{'findUser'});

定义 Mock 方法的行为

您可以指定某个 mock 方法返回特定的值或在不同情况下引发异常。

指定 findUser 方法在使用任何输入调用时返回 "Unknown"。默认情况下,当您调用 findUser 方法时,MATLAB® 将返回一个空数组。

  • assignOutputsWhen 方法用于定义调用该方法时的返回值。

  • 模拟方法调用 (behaviorObj.findUser) 用于隐式创建一个 MethodCallBehavior 对象。

  • MethodCallBehavior 对象的 withAnyInputs 方法用于指定行为适用于具有任何数量的输入以及任何值的方法调用。

testCase.assignOutputsWhen(withAnyInputs(behaviorObj.findUser),"Unknown")
n = mock.findUser(1)
n = 

    "Unknown"

指定当输入值为 1701 时 mock 方法返回 "Jim"。只有对于输入值 1701,此行为才会取代返回值 "Unknown",因为它是在该设定后定义的。

testCase.assignOutputsWhen(behaviorObj.findUser(1701),"Jim")
n = mock.findUser(1701)
n = 

    "Jim"

指定当 findUser 方法仅使用该对象作为输入来调用时,mock 方法返回 "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 命名空间中的类来帮助定义行为。指定 findUser 在使用大于 5000 的 ID 调用时引发异常。

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 作为 ID。

testCase.assignOutputsWhen(withNargout(2, ...
    withAnyInputs(behaviorObj.findUser)),"??",-1)
[n,id] = mock.findUser(13)
n = 

    "??"


id =

    -1

定义 Mock 属性的行为

访问某个 mock 属性时,您可以指定该属性返回特定的或所存储的属性值。设置此值时,可以指定该 mock 何时存储属性值。此外,还可以定义测试框架针对 mock 属性设置或访问活动何时引发异常。

定义 mock 属性的行为时,请记住在命令行窗口中显示属性值为一种属性访问 (get) 操作。

与定义 mock 方法的行为类似,定义 mock 属性的行为需要使用 PropertyBehavior 类的实例。当您访问 mock 属性时,该框架会返回此类的实例。要定义访问行为,请通过调用 PropertyGetBehavior 类的 get 方法来使用 PropertyBehavior 的实例。要定义设置行为,请通过调用 PropertySetBehavior 类的 setsetToValue 方法来使用 PropertyBehavior 的实例。

指定当 Name 属性设置为任何值时测试框架引发异常。

  • throwExceptionWhen 方法指示该框架对指定行为引发异常。

  • 访问行为对象 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"

允许该 mock 在属性设置为 "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 命名空间中某个类的实例传递给该行为类的 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

依次为 ID 属性指定值 1138 和 237。然后,在发生属性访问时引发异常。每次调用 then 方法最多接受两个操作。要指定更多后续动作,请多次调用 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" 两次。

when(withExactInputs(behaviorObj.findUser),repeat(2,AssignOutputs("Phil")))
n = mock.findUser
n = mock.findUser
n = 

    "Phil"


n = 

    "Phil"

第三次调用该函数。如果您重复执行某一动作,并且随后不调用 then 方法,则该 mock 会继续返回重复的值。

n = mock.findUser
n = 

    "Phil"

定义设置 Name 的值时的行为。前两次引发异常,然后存储该值。

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

另请参阅

相关主题