程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Amop在VC6下的使用方法

Amop在VC6下的使用方法

編輯:關於C語言

      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後面有注釋,則會出現編譯錯誤:把該注釋換到下一行即可。 更完整的帶圖的版本請參考附件。

本文出自 “果凍的軟件技術博客” 博客,請務必保留此出處http://sinojelly.blog.51cto.com/479153/214385

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved