我正在尝试使用Cmockery模拟从C++代码调用的C函数。因为SUT是C++,所以我的测试必须是C++。
当我像这样使用Cmockery Expect_string()宏时:
expect_string(mock_function, url, "Foo");
我得到:
my_tests.cpp: In function ‘void test_some_stuff(void**)’:
my_tests.cpp:72: error: invalid conversion from ‘void*’ to ‘const char*’
my_tests.cpp:72: error: initializing argument 5 of ‘void _expect_string(const char*, const char*, const char*, int, const char*, int)’
我在cmockery.h中看到Expect_string已定义:
#define expect_string(function, parameter, string) \
expect_string_count(function, parameter, string, 1)
#define expect_string_count(function, parameter, string, count) \
_expect_string(#function, #parameter, __FILE__, __LINE__, (void*)string, \
count)
这是_expect_string的原型(prototype)(来自cmockery.h):
void _expect_string(
const char* const function, const char* const parameter,
const char* const file, const int line, const char* string,
const int count);
我相信问题在于我正在将C代码编译为C++,因此C++编译器反对将Expect_string_count宏中的
(void*)string
作为const char* string
参数传递给_expect_string()函数。我已经在my_tests.cpp中的cmockery.h中使用了
extern "C"
,如下所示:extern "C" {
#include <cmockery.h>
}
...以解决名称修改问题。 (请参阅“How do I compile and link C++ code with compiled C code?”)
是否有命令行选项或其他某种方式告诉g++如何放松从测试的C++代码到cmockery.c中C函数的类型转换限制?
这是我当前用来构建my_tests.cpp的命令:
g++ -m32 -I ../cmockery-0.1.2 -c my_tests.cpp -o $(obj_dir)/my_tests.o
最佳答案
我知道这不是您的代码,但是看起来更简单的方法可能是通过将强制类型转换为cmockery.h
来修复(void*)
(可能仅使用#ifdef __cplusplus
将某些部分激活为C++)。
甚至可以将它们放在您的代码中,只需重新定义expect_string_count
宏
#ifdef __cplusplus
#undef expect_string_count
#define expect_string_count(function, parameter, string, count) \
_expect_string(#function, #parameter, __FILE__, __LINE__, string, \
count)
#endif