2017-08-28 116 views
2

我正在寫單元測試,想知道如何測試函數指針與Cmockery。驗證函數指針指向函數的地址。 CMockery

File A.c 

void (*FunctionPtr)(void) = &funcA; 

void funcA() 
{ 
    //calls func B 
    funcB(); 

} 

TestA.c 

void Test_A(void ** state) 
{ 
    /// test for FunA 
    // working as expected 
} 
void Test_FunctionPtr(void** state) 
{ 
    /// how to check here that FunctionPtr holds memory location of funcA 
    // I tried something like below 
    assert_memory_equal(FunctionPtr, funcA(), sizeof(funcA())); 

} 

在運行期間,我收到錯誤,我不知道如何解決這個問題。可能是我使用錯誤的API來斷言,但不知道哪一個打電話。 下面是我的錯誤在運行時
錯誤:
Test_FunctionPtr:開始測試 沒有找到符號funcB條目。

+3

「如何在這裏檢查FunctionPtr保存funcA的內存位置」 - >你試過'assert(FunctionPtr == funcA);'?注意:在'void(* FunctionPtr)(void)= &funcA;' – chux

+3

'funcA()'中調用'funcA'函數之前使用_define_'funcA()'的最佳實踐'funcA',它會返回任何無法比較的函數。 – mch

+0

@mch看起來幾乎就像一個答案。你想成爲一個嗎?也許添加一個解決方案,我認爲它會使用'funcA'而不是'funcA()'。 – Yunnosch

回答

1

funcA()調用函數。你需要一個指向函數的指針,它是funcA&funcA(對於你使用的那個:read here)沒有什麼不同。

你也想比較的funcA地址保存在FunctionPtr值。你不想比較FunctionPtr指向的內存和函數。

所以不是assert_memory_equal(FunctionPtr, funcA(), sizeof(funcA()));assert(FunctionPtr == funcA);

您在您的評論您正在使用assert_int_equal現在寫我會用。請注意,這兩個值都不是int,因此如果宏在錯誤情況下使用printf%d(或類似),則會調用未定義的行爲。