Имитация статических функций, объявленных и определенных в .cpp без файла класса с использованием GMOCK

file.h
int func(int);

file.cpp
static int call();
static void print(int x);

int func(int) {
    int val = call();
    print(val);
}

Здесь статические функции объявляются и определяются в том же файле file.cpp. Я не включил здесь определение статических функций. Теперь, используя GMock, мне нужно смоделировать или протестировать все функции, определенные в .h и .cpp.


person Daemon    schedule 29.07.2013    source источник
comment
Но зачем вам мокировать функции, которые объявлены и определены локально в вашей единице компиляции? Это не часть общедоступного интерфейса, верно??   -  person πάντα ῥεῖ    schedule 29.07.2013
comment
Между насмешкой и тестированием есть разница, они практически противоположны. Большинство классов будут протестированы в одном файле, а затем смоделированы, возможно, во многих файлах. Вы можете протестировать свою функцию print(), выполнив #include "file.cpp" в своем gmock fileTest.cpp (или как вы это называете). При тестировании других классов вы должны были замаскировать func(), чтобы им даже не нужно было знать о print().   -  person dwanderson    schedule 07.12.2015


Ответы (2)


Поскольку эти две функции скрыты, у вас нет другого способа проверить их, кроме вызова функции func.

Это означает, что вы не можете имитировать вызовы функций «вызов» и «печать».

Единственный способ — каким-то образом отобразить эти две функции или хотя бы изменить способ их вызова.

Если вы создаете переменные обратного вызова функции в своем заголовке и вызываете их вместо реальных функций, вы можете имитировать эти вызовы. Что-то вроде этого (не проверено):

file.h
typedef void call();
namespace hidden{
extern call callCb;
}
int func(int);

file.cpp
namespace{
void call(){
//do stuff
}
}
namespace hidden{
call callCb=::call;
}
int func(int){
  hidden::callCb();
  // do things
}
person BЈовић    schedule 29.07.2013

Единственный ответ, который я могу дать, — это ответ из Часто задаваемые вопросы о GMocks:

Мой код вызывает статическую/глобальную функцию. Можно поиздеваться?

Можно, но нужно внести некоторые изменения.

В общем, если вам нужно имитировать статическую функцию, это признак того, что ваши модули слишком тесно связаны (и менее гибки, менее пригодны для повторного использования, менее тестируемы и т. д.). Вам, вероятно, лучше определить небольшой интерфейс и вызывать функцию через этот интерфейс, который затем можно легко смоделировать. Сначала это небольшая работа, но обычно она быстро окупается.

Этот сообщение в блоге тестирования Google говорит об этом превосходно. Проверьте это.

person πάντα ῥεῖ    schedule 29.07.2013