2016-11-08 21 views
0

我正在學習使用Ceedling和CMock for Mock在現有嵌入式C代碼庫(我可以調整以適合它)上進行單元測試。如何在同一UUT中模擬函數C

我遇到了單元中的一個函數調用同一單元內的第二個函數的情況。

int foo_a(int r) 
{ 
    /* foo_a work */ 
    /* do not wish to test this function just to test foo_b. */ 
} 

int foo_b(int i) /* function to test */ 
{ 
    /* foo_b work */ 
    if (some_condition) 
     foo_a(k); /* need to test if foo_a() is called or not. */ 
} 

我不想考foo_a()foo_b()測試的一部分。我如何模擬foo_a(),這樣我仍然可以測試它是否被調用,但不測試foo_a()函數本身?

+0

我對C的瞭解不多,但如果它與許多其他語言一樣,可以將方法標記爲虛擬/可覆蓋。在這樣的情況下,你可以提供一個模擬/僞造的已知/設置的返回'foo_a'。這樣,當使用模擬/僞造類時,當你調用'foo_b'時,你會碰到你的模擬/重寫的'foo_a'方法,而不是真正的impl,所以你可以專注於測試'foo_b'而不用擔心'foo_a 'impl。 – Kritner

+1

@ kritner C不是面向對象的。它沒有諸如虛擬,可重寫,繼承或多態等概念。 – Toby

回答

0

如果不修改源代碼,則無法執行此操作。

考慮將功能分解爲兩個單獨的編譯單元。

或者,圍繞要替換的功能添加一個#ifndef TEST

+0

這可以讓我介紹一個假的,但是我怎樣才能確定這個假貨是否被叫?首先想到的是簡單地引入一個全局標誌,如果調用了僞造,那麼將會設置全局標誌,然後在我的測試中檢查標誌。有沒有更好的方法或更多的推薦做法? – Toby