如何改变财产的行为的一个嘲笑对象
27日视图(30天)
显示旧的评论
我想用嘲笑的单元测试框架
我试图使模拟对象的属性返回另一个模拟对象,但没有财产的行为对象
classdefMyClass
属性(GetAccess =公共SetAccess =保护)
prop1;
结束
方法
函数这个回答= ()
结束
结束
结束
这是模拟此话:
testCase = matlab.mock.TestCase.forInteractiveUse;
[模拟,behav] = testCase.createMock (? MyClass);
%这将obciously抛出一个异常,因为属性集方法保护
模拟。prop1 =”“;
你不能设置只读属性的prop1 MyClassMock。
%这抛出一个异常,因为没有这个属性的行为对象
p = behav.prop1;
没有适当的方法、财产或字段“prop1”类“matlab.mock.classes.MyClassBehavior”。
现在我不能设置模拟对象的价值,因为设置访问保护
我不能使用行为对象改变财产的行为,因为我找不到propertyBehavior的任何地方
我显然少了什么,但所有的例子我见过在文档中展示了如何使用一个定制的模拟对象“AddedProperties”
我可以解决这个错误的方式,但我更喜欢使用元类来创建模拟对象
0评论
接受的答案
M井
2019年8月15日
编辑:M井
2019年8月15日
MATLAB模拟对象仍然是一个最近的特性,我不认为他们是实际的测试类。仍有不少功能缺乏sufficiantly复制对象的行为,例如有一个模拟对象方法调用赋值一个受保护的财产。
上述案例的解决方案是创建你的模拟不使用元类的实例:
testCase = matlab.mock.TestCase.forInteractiveUse;
[MyClassMock,行为]= createMock (testCase,“AddedProperties”,“prop1”,“AddedMethods”,“答案”)
testCase.assignOutputsWhen (get (behaviour.prop1),“abc”)
p = MyClassMock.prop1
这不是理想的,但我不认为有任何其他选择。你仍然可以测试违规访问:
进口matlab.mock.actions.ThrowException
当(设置(behaviour.prop1),…
ThrowException (MException (“MATLAB:类:SetProhibited”,…
“你不能设置只读属性MyClass的“prop1”。)))
创建一个模拟从一个元类只适用于类和抽象的属性和方法。
4评论
men8th
2023年4月19日10点
编辑:men8th
2023年4月19日在47
我已经成功地使用恩在上面的评论建议的技术来生成模拟对象覆盖
.isa
方法。几个指针:
- 覆盖.isa时,你必须返回一个char向量,而不是一个字符串。例如如此:testCase.assignOutputsWhen (mockBehaviour.isa (“MyClass”),真的),但这并不testCase.assignOutputsWhen (mockBehaviour.isa (“MyClass”),真的)
- cludge解决办法可能会搬到一个方案,所有类都定义了一个抽象接口基本上什么也不做除了定义属性和方法。我不是专家,但看到这与c#类都设置了一个接口IMyClass和一个具体的版本MyClass。不确定以后会怎么样在实践中,这似乎是一个大量的工作。
我同意狼薄板-请我们能再要一些这个Mathworks开发工作。