我正在尝试使用 CMocka 和 GCC 的--wrap
链接器选项来模拟 C 函数。到目前为止,这种技术在模拟 stdlib 函数(如fgets
、popen
、pclose
等)方面效果很好。
但是现在我正在尝试模拟静态库中的函数,但这也不起作用。事实上,静态库函数总是被调用,即使我尝试使用--wrap
. 我设法在 foobar 项目中重现了这一点。
这是我非常简单的静态库的源代码:
你好.h
#ifndef HELLO_H
#define HELLO_H
void hello();
void world();
#endif /* HELLO_H */
你好ç
#include "hello.h"
#include <stdio.h>
void world()
{
printf("world from lib\n");
}
void hello()
{
printf("hello\n");
world();
}
这是我的测试程序的源代码:
测试.c
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <stdio.h>
#include "cmocka.h"
#include "hello.h"
void __wrap_world(void)
{
puts(mock_ptr_type(char*));
}
void test_hello(void **state)
{
(void) state; /* unused */
assert_int_equal(7, 1 + 2 * 3);
will_return(__wrap_world, "world from tests\n");
hello();
}
const struct CMUnitTest mytests[] = {
cmocka_unit_test(test_hello),
};
int main(void)
{
return cmocka_run_group_tests(mytests, NULL, NULL);
}
最后,链接器行如下(我使用的是 CMake,所以这就是为什么它看起来很奇怪),为您的眼睛分成多行:
/usr/bin/cc \
-Wall -Wextra -Werror -std=c99 \
CMakeFiles/tests.dir/tests.c.o \
-o tests -Wl,-rpath,/home/microjoe/cmake-fail/cmocka/build/src \
-rdynamic -lgcov /home/microjoe/cmake-fail/cmocka/build/src/libcmocka.so \
-Wl,--wrap,world \
-fprofile-arcs -ftest-coverage \
../lib/libhello.a
当然,测试输出表明 wrap 函数没有按预期调用:
[==========] Running 1 test(s).
[ RUN ] test_hello
hello
world from lib
[ ERROR ] --- __wrap_world() has remaining non-returned values.
/home/romain/cmake-fail/hello/tests/tests.c:23: note: remaining item was declared here
[ FAILED ] test_hello
[==========] 1 test(s) run.
[ PASSED ] 0 test(s).
[ FAILED ] 1 test(s), listed below:
[ FAILED ] test_hello
1 FAILED TEST(S)