指定 Mock 对象行为
当您创建 mock 时,还会创建一个用于控制 mock 行为的关联行为对象。使用此对象可定义 mock 方法和属性的行为 (stub)。有关创建 mock 的详细信息,请参阅创建 Mock 对象。
mock 对象是超类所指定接口的抽象方法和属性的实现。您也可以在没有超类的情况下构造 mock,在这种情况下,mock 具有一个隐式接口。
创建一个具有隐式接口的 mock。该接口包含 Name
和 ID
属性以及 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
类的 set
或 setToValue
方法来使用 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 类(允许定义重复行为和后续行为) |
---|---|---|
在发生方法调用和属性访问时返回指定的值。 | 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