Как использовать библиотеку cmocka для макета функции из сторонней библиотеки, которая не может быть изменена? - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь написать контрольный пример в c, используя библиотеку cmocka. Мой тестовый случай тестирует функцию, которая затем внутренне вызывает функцию из сторонней библиотеки (не может изменить библиотеку). Эта функция возвращает значение NULL, когда приложение не и я хочу смоделировать возвращаемое значение для этой функции библиотеки третьей стороны. Как я могу добиться этого?

Я пытался использовать функцию will_return в cmocka для получения желаемого возвращаемого значения, но она не работает

void third_party_func()
{
   return mock();
}
void my_func_to_be_tested()
{
   int ret;
   ret = third_party_func();
   return ret;
}
void test_do_mytest(void ** state)
{
   (void) state;
   int ret;
   will_return(third_party_func,1);
   ret = my_func_to_be_tested();
   assert_int_equal(1,ret);
}
const struct CMUnitTest tests[] = {
    cmocka_unit_test(test_do_mytest),
};


int main(void)
{
    return cmocka_run_group_tests(tests, NULL, NULL);
}

Я получаю ошибку компиляции при множественном определении third_party_func (). Как обработать такой случай?

Я хочу получить желаемое значение в качестве возвращаемого значения для моей функции стороннего производителя.

1 Ответ

0 голосов
/ 28 марта 2019

Вы пробовали флаг __wrap_?

Измените имя вашей функции с третьего_частного_функции на __wrap_third_party_func и добавьте следующую директиву в gcc, например, с функцией fopen:

FILE * __wrap_fopen(const char *__restrict __filename,
                const char *__restrict __modes)
{
  return mock_ptr_type(FILE*);

}

и добавьте директиву в gcc, например:

$ gcc -g -Wl,--wrap=fopen

Надеюсь, это поможет!

...