2016-08-31 48 views
6

我會盡量讓這個純粹的最小范例儘可能適用於儘可能多的人,以及保護任何可能違反NDA的代碼共享。希望這是好的!CppUTest單元測試框架多重定義例外

我正在使用CppUTest和CppUMock(用gcc/g ++編譯並使用CMake創建makefiles)與Gitlab持續集成軟件一起創建未來提交和發佈軟件的單元測試環境。但是,我遇到了一些問題。比方說,我有以下文件夾的設置(即我得改變最小的能力,比/測試文件夾的內容除外):

+-- src 
    +-- driver1.c 
    +-- driver2.c 
+-- inc 
    +-- driver1.h 
    +-- driver2.h 
+-- tests 
    +-- test_driver1.cpp 
    +-- test_driver2.cpp 
    +-- main.cpp 
    +-- cmakelists.txt 

的CMakeLists文件將包含包括INC文件夾,SRC的編譯文件夾和編譯測試文件夾。然而,讓我們說,driver2.c依賴於由driver1.c定義的方法。如果沒有模擬設置,這很好,因爲你可以正常測試對driver2方法的調用結果。但是,假設我想模擬driver1的method1函數,以便我可以檢查driver2是否正確調用了method1(使用CppUMock)。這通常會被罰款,如果驅動1沒有被編譯,但是添加一些像這樣的test_driver2.cpp文件:

void method1(int n) { 
    mock().actualCall("method1").withParameter("n", n); 
} 

會造成與實際方法1的碰撞中driver1.c用連接錯誤,如所以:

CMakeFiles/Tests.dir/.../src/driver1.c:(.text+0x11d): multiple definition of 'method1' 
CMakeFiles/Tests.dir/.../src/test_driver2.cpp:(.text+0x0): first defined here 

按照評論者的要求,這裏是什麼包括結構如下:

driver1.c includes driver1.h (obviously) 
driver2.c includes driver2.h (obviously) 
driver2.h includes driver1.h (for calling method1) 
test cpp files include their respective .h files 
(test_driver1.cpp -> driver1.h and test_driver2.cpp -> driver2.h) 

方法1在driver1.h聲明和driver1.c定義。我無法編輯這些文件。

我很高興按要求添加細節。

解決這個嘲諷問題的最佳方法是什麼?

+0

您需要顯示(至少摘錄)您定義method1的部分,以及如何將#include各種標頭放入源文件中 – TemplateRex

+0

@TemplateRex added includes。 method1只是driver1.c文件中的任何舊方法,並在driver1.h文件中聲明。 – Jeffrey

+0

您無法在driver2.cpp中添加另一個'method1()',並將其與driver2.cpp一起鏈接到測試驅動程序中。如果你想模擬,你應該告訴CMake不要將driver1.cpp編譯爲test_driver2.cpp的依賴關係。 – TemplateRex

回答

3

如果你想嘲笑從driver1.hmethod1,只需添加嘲笑定義在一個單獨的mock_driver1.cpp,然後在你的CMakeLists.txt:

add_executable(target1 test_driver1.cpp driver1.cpp) 
add_executable(target2 test_driver2.cpp driver2.cpp mock_driver1.cpp) 

一旦你完成嘲諷,更換mock_driver1.cpp依存性driver1.cpp

這一切都假定您爲每個測試驅動程序都有單獨的可執行文件。

但是,如果您想要一個大型主程序將所有驅動程序鏈接在一起,則不能同時存在真實的method1和模擬的method1。爲此,我建議在命名空間mock或類似的東西中包裝模擬的method1,並且只能在test_driver2.cpp中調用mock::test1

+0

謝謝!我將爲我的python構建腳本添加能力,只運行目錄中的所有可執行文件,而不僅僅是tests.exe,這樣我就可以擁有多個構建版本,例如2501。如果我能得到這個改變,我會回來+1並接受答案。 – Jeffrey

+0

+1很棒!我錯過的東西就是每個測試都有多個編譯單元,這比將它們融入其中更容易。 – Jeffrey

+0

@傑弗裏非常有幫助 – TemplateRex