Spring4D中Mock赋值接口时触发EConvertError错误求助
接口Mock类型转换错误解决思路
问题场景
使用Mock框架模拟接口时,触发EConvertError错误,提示Mock<Unit1.IMyIfc> cannot be converted to IMyIfc,相关代码如下:
接口声明
type IMyIfc = interface(IInvokable) ['{11D3AAF1-7A3E-45CA-9FB4-090010A29FC5}'] function Test: integer; end; IMySecondIfc = interface(IInvokable) ['{3360E5DB-6EDD-4F6E-A8C5-B2FB0ED7C0CD}'] function GetTestProp: IMyIfc; procedure SetTestProp(const Value: IMyIfc); property TestProp: IMyIfc read GetTestProp write SetTestProp; end;
测试代码(错误行标记)
var myIfcMock: Mock<IMyIfc>; mySecondIfcMock: Mock<IMySecondIfc>; mySecondIfc: IMySecondIfc; testIfc: IMyIfc; myIfcMock.Setup.Returns(5).When.Test; mySecondIfcMock.Setup.Returns(myIfcMock).When.TestProp; // 错误根源 mySecondIfc := mySecondIfcMock; testIfc := mySecondIfc.TestProp; // EConvertError错误触发点 ShowMessage(testIfc.Test.ToString);
解决思路
- 错误本质:
Mock<T>是框架的包装类,并非直接实现T接口的实例。直接返回myIfcMock对象,会导致返回值类型(Mock<IMyIfc>)与接口要求的IMyIfc不匹配。 - 修正方案:调用
Mock<T>的Instance属性(不同Mock框架可能命名为MockedObject等,需对应框架调整),获取实际模拟的接口实例作为返回值:mySecondIfcMock.Setup.Returns(myIfcMock.Instance).When.TestProp; - 逻辑验证:修改后,
TestProp返回的是符合IMyIfc类型的模拟实例,类型转换可正常完成,后续调用testIfc.Test能正确返回预设的5。
内容的提问来源于stack exchange,提问作者Anders G
相关产品推荐
相关产品推荐

