2010-05-05 49 views
0

當我運行單元測試時,我希望能夠「存根」或創建一個模擬對象,但我正在運行到DLL地獄。單元測試的Visual C++覆蓋/模擬對象?

例如:構建了兩個DLL庫:A.dll和B.dll - A.dll中的類具有對B.dll中的類的調用,所以當構建A.dll時,鏈接行使用B .lib的定義。

我的測試驅動程序(Foo.exe)正在測試A.dll中的類,因此它與A.lib鏈接。但是,我想用簡單的版本(返回基本值,沒有數據庫查找等)「刪除」A.dll對B.dll所做的一些調用。

我無法構建一個覆蓋所需方法(不是整個類)的Override.dll,並替換B.dll,因爲Foo.exe會A)抱怨說如果我只是刪除它, Override.dll在它的位置或B)如果我將Override.dll重命名爲B.dll,Foo.exe會抱怨存在未解決的符號,因爲Override.dll不是B.dll的完整實現。

有沒有辦法做到這一點?有沒有辦法將Foo.exe與A.lib,B.lib和Override.lib靜態鏈接,這樣它就可以工作,而無需完全重建A.lib和B.lib以除去__delcspec(dllexport)?還有其他選擇嗎?

回答

0

只有在鏈接對象模塊列表中未找到函數時,鏈接器纔會搜索庫。解決方案是將您的存根建立到與測試驅動程序模塊鏈接的對象模塊中。

+0

問題是在B.dll中類的頭文件中的類上有一個__delcspec(dllimport/dllexport)宏。我的理解是告訴連接器在外部DLL中查看這個類的實現。因此,我不認爲我可以在不修改包含的標題的情況下以這種方式進行覆蓋。 創建.obj會導致「不一致的dll鏈接」警告,並且運行Foo.exe仍會忽略該重寫。 – Mark 2010-05-05 23:09:06