【问题标题】:Correct way to temporarily enable and disable function wrapping in cmocka?在 cmocka 中临时启用和禁用功能包装的正确方法?
【发布时间】:2015-06-24 13:40:12
【问题描述】:

我正在使用cmocka 库来测试一些嵌入式c 代码。根据文档,我使用 __wrap_ 前缀来模拟函数,这样我就可以隔离我的单元测试。但是,一旦我这样做了,对函数的所有调用都将永远转到包装函数。如何在某些情况下重新启用实际功能,以便我可以对其进行测试或允许其他功能使用它?在我看来,唯一的方法是使用全局字段作为开关来调用真正的函数,如下所示:

int __wrap_my_function(void) {
    if (g_disable_wrap_my_function) {
        return __real_my_function();
    }

    // ... do mock stuff
}

这是正确的做法吗?

【问题讨论】:

    标签: c unit-testing cmockery cmocka


    【解决方案1】:

    您只需在没有 -wrap 命令行选项的情况下进行编译。

    或者你使用定义:

    #include <cmocka.h>
    #ifdef UNIT_TESTING
    #define strdup test_strdup
    #endif
    

    添加模拟函数 test_strdup。您现在可以使用此功能进行测试。

    【讨论】:

    • 我不明白你的回答,我为什么要使用#define 来模拟strdup 之类的函数? cmocka 的全部意义在于它允许我结合--wrap gcc 选项来模拟函数。我想知道如何使用 cmocka 我可以为一个单元测试模拟 strdup 而不是为另一个单元测试模拟它。
    【解决方案2】:

    我最终完全按照我在问题中的建议做了。我使用了一个全局变量,我在包装函数中签入该变量以在运行时启用和禁用模拟。

    【讨论】:

    • 这不是一个好的解决方案。你最好按照@asn 写的来做:'compile without the -wrap command line option'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2014-04-17
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多