Я пытаюсь использовать библиотеку насмешек FFF для C (https://github.com/meekrosoft/fff) для модульного тестирования C кода. Проблема, с которой я сталкиваюсь, заключается в том, что g cc рассматривает мой фиктивный объект как переопределение исходной функции и из-за этого выдает ошибки компилятора.
Я создал 2 файла тестирования, которые имитируют мои варианты использования. my_lib.c
имеет определения некоторых внутренних функций. test.c
импортирует my_lib.c
, потому что цель состоит в том, чтобы протестировать все функции из исходного файла.
//my_lib.c
int thing = 0;
int get_thing () {
return thing;
}
int do_thing (void) {
return thing;
}
int set_thing (int x) {
thing = x;
return do_thing();
}
//test.c
#include "fff.h"
#include "my_lib.c"
DEFINE_FFF_GLOBALS;
FAKE_VALUE_FUNC0(int, do_thing);
void setup(void)
{
// Reset the FFF call history between tests
FFF_RESET_HISTORY();
// Reset the FFF mock objects between tests
RESET_FAKE(do_thing);
}
void test_do_thing(void)
{
set_thing(11);
ASSERT_EQ(1, do_thing_fake.call_count);
}
void test_nested_mock(void)
{
do_thing_fake.return_val = -2;
int ret = set_thing(11); //set_thing() returns do_thing() which is mocked to return -2
ASSERT_EQ(-2, ret);
}
Я собираю в объектный файл следующим образом , но это дает мне немедленную ошибку компиляции:
$ gcc -g -c test.c -o test.o
In file included from test.c:1:0:
test.c:7:23: error: redefinition of ‘do_thing’
FAKE_VALUE_FUNC0(int, do_thing);
^
fff.h:1632:45: note: in definition of macro ‘DEFINE_FAKE_VALUE_FUNC0’
RETURN_TYPE FFF_GCC_FUNCTION_ATTRIBUTES FUNCNAME(void){ \
^
test.c:7:1: note: in expansion of macro ‘FAKE_VALUE_FUNC0’
FAKE_VALUE_FUNC0(int, do_thing);
^
In file included from test.c:3:0:
my_lib.c:12:1: note: previous definition of ‘do_thing’ was here
do_thing (void)
^
Мне нужно иметь возможность макетировать функции из исходных файлов, в то же время я могу тестировать устаревшие исходные файлы без изменения любого источника или заголовочные файлы. Чего мне не хватает с fff и / или g cc?
РЕДАКТИРОВАТЬ: Позвольте мне добавить это. Я мог бы удалить определение do_thing () из my_lib.c
, а затем моя компиляция, макеты и тесты работают точно так, как ожидалось, потому что все вызовы do_thing теперь go для моего фиктивного объекта. Я хочу иметь возможность макетировать функцию, которая уже определена в тестируемом исходном коде.