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后面有注释,则会出现编译错误:把该注释换到下一行即可。
更完整的带图的版本请参考附件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值