VC编程之Amop在VC6下的使用方法
小标 2019-04-02 来源 : 阅读 1325 评论 0

摘要:本文主要向大家介绍了VC编程之Amop在VC6下的使用方法,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之Amop在VC6下的使用方法,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之Amop在VC6下的使用方法

      Amop是一个开源的自动Mock工具(向原作者致谢,给我们开发了这么好用的框架),它是利用虚函数表实现的Mock,所以只适用于虚函数的Mock(原作者强调的是只适用于纯虚函数,据尝试,只要是虚函数都可以使用)。与同类C++ Mock工具相比,Amop最大的好处是,它不需要实现虚拟的类,完全由Amop框架处理,大大方便了用户使用。  
      Amop中大量使用了Template,而Visual C++ 6.0出现在C++标准发布之前,对于模板的支持非常弱,所以此工具在Visual C++ 6.0中使用存在很大困难,而Visual C++ 6.0很早便没有出新版本了,是否Visual C++ 6.0下无法使用Amop工具了呢?   
笔者经过曲折的探索,终于找到了一种可行的方案。   
      Intel C++编译器可以集成到Visual C++ 6.0中,而Intel C++编译器一直有新版本,现在有版本已经对模板支持较好,所以安装一个Intel C++编译器便可以解决编译问题。由于Amop直接用到了虚函数表,很多特性跟编译器实现紧密相关,所以在Intel C++编译器下编译时也发现了好多问题,最终舍去Amop的部分功能后,编译、测试通过。所以现在的Amop可以在一定限制条件下(是虚函数、不是Destructor、不使用char *类型参数的比较)在Visual C++ 6.0下使用。

 

1.VC6集成Intel C++ 8/9的方法。   
1 安装VC6英文版,安装时选择“全部选择”,避免不支持Unicode。   
2 安装Intel C++,注意需要把lisence放到不含空格和中文字符的路径中。   
3 安装中可以选择“不安装italian”。   
4 安装完成后,点击如下菜单, 打开编译器设置对话框。   
5 选中Intel编译器,则会用Intel编译器进行编译。

 

2.Amop环境配置   
把Amop头文件和库文件(换一种编译器需要重新编译库文件)放到$(LLT_PATH)\Amop目录中。然后在工程中做如下设置:   
1、编译参数增加:/I "$(LLT_PATH)\Amop\include"   
2、链接参数增加:/libpath:"$(LLT_PATH)\Amop\lib\VC6\Intel9.1"   
3、把Amop.lib链接到工程中。   
4、使用Amop工具的文件中包含MockObject.h文件并使用amop命名空间。

 

3.Amop使用方法   
3.1.定义mock对象   
假定要测试的接口(类)是IInterface,那么通过如下语句定义mock对象。   
TMockObject<IInterface> mock;   
3.2.设置要Mock的函数   
假定SimpleFunction是IInterface中定义的一个虚函数。   
mock.Method(&IInterface::SimpleFunction);   
如果不设置要Mock的函数,调用这个函数(((IInterface*)mock)‐&gt;SimpleFunction())时会抛出异常TNotImplementedException。   
3.3.设定函数返回值(Will/Wills)   
如果需要函数ComplexFunction返回指定值,那么可以用Will设定它的返回值。(注意:mock是设定mock对象的行为,都是让mock对象产生一个预计的结果,除Expect能判断入参是否正确外,其它命令都是设定它的行为。 没有办法设定判断每次调用的返回值。要区分被测对象和Mock的对象。)   
只设定一个返回值则用Will,设定多个用Wills。   
mock.Method(&IInterface::ComplexFunction) .Will("Test Result");

 

设定函数多次调用中每一次的返回值:

 

设定返回值的个数与调用次数不同会抛出异常。

 

3.4.设定函数抛出指定的异常(Throw/Throws)   
如果需要函数SimpleFunctionWithReturn抛出SimpleException(22)异常,那么可以用Throws设定它抛出的异常。

 

3.5.设定函数调用中的期望入参(Expect/Expects)   
如果输入的入参不是设定的值,则会抛出异常。   
见如下用例,模板参数(<>内的)是参数序号,从0开始,这里有三个参数。

 

设定多次调用每次的期望入参  
如下用例设定了三次调用每一次的期望入参。

 

设定的期望入参并检验。  
   
3.6.设定函数设置出参为指定的值(Set/Sets)   
用Set函数,尖括号内为出参的序号(从0开始编号)。

 

设定函数多次调用中每一次调用的输出

 

3.7.检查函数的调用次数(Count)   
Count()可以获取函数调用次数,如果用在设置Mock函数之后则可以设定函数调用次数。   
获取函数的调用次数。   
设定函数的调用次数,然后用Verify检验是否按预定方式运行。

 

3.8.检查运行结果(Verify)   
参见3.7的最后一个用例。要求用例中一定要用Verify检查运行过程与预期是否符合,避免遇到不符合情况也不报错。   
3.9.清除设置Mock的函数(Clear)

 

3.10.设定函数调用重定向(Redirect)   
调用中重定向到另外一个函数(相当于打桩)。

 

4.VC6编译器出现在C++国际标准出现之前   
4.1.C++标准里程碑   
Milestones   
The complete list of former and proposed target dates is shown in below.   
date Event   
‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   
9/89 USA requested to submit C++ New Work Item Proposal   
4/91 Approved C++ NP   
6/91 First meeting of WG21   
12/93 Circulate informal draft within SC22   
7/94 Vote to register WD as CD; Mtg #10.   
9/94 Complete editorial corrections; provide WD to SC22.   
10/94 Begin CD registration ballot.   
3/95 Complete CD registration ballot resolutions; Mtg #12.   
6/95 Begin CD ballot.   
7/96 Complete CD ballot resolution; Mtgs #14‐16   
9/96 Begin second CD ballot   
7/97 Complete second CD ballot resolution; Mtg #18, 19   
9/97 Begin FDIS ballot   
4/98 Complete editorial corrections from DIS ballot   
resolution. Send IS to ITTF (with final report).   
9/98 ITTF to publish the International Standard.   
4.2.Visual C++ 6.0发布时间   
从下图可以看出大概在98年:

 

5.Amop编译问题解决过程   
1、编译无法通过,原因是Destructor类型字节数与普通指针字节数不同。去掉一个测试析构函数的用例后,编译OK。   
2、链接无法通过。用编译选项去掉TestAmop的两个库/nodefaultlib:"LIBCPD.lib" /nodefaultlib:"LIBCD.lib"之后,还有UnitTest++调用的函数没有实现的问题,发现UnitTest++和Amop定义的编译选项有问题,一个MLd、一个MDd,全部统一成MDd之后,编译OK。   
3、还有四个用例不过,运行过程中抛出异常。经过定位发现是const char*参数比较会认为参数不同,参数不同则Amop会抛出异常。用char *和char[]都一样抛出异常。用std::string就OK了。   
virtual void SimpleFunctionWithParams(float, std::string, /*const char* */std::string) = 0;   
virtual int SimpleFunctionWithParamsAndReturn(float, std::string, /*const char* */std::string) = 0;   
4、Intel9.1编译器,如果#endif后面有注释,则会出现编译错误:把该注释换到下一行即可。

 

更完整的带图的版本请参考附件。

   

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程