На данный момент я немного застрял со следующей проблемой, так как в настоящее время я не знаю, как ее решить. Цель состоит в том, чтобы имитировать некоторые функции c, которые идут вместе с fcntl.h, например открытие файла. В результате я построил структуру GMock, которая выглядит так:
Мок-класс:
class FileHandlingLib_MOCK
{
public:
virtual ~FileHandlingLib_MOCK() {}
//mock
MOCK_METHOD2(open, int(const char* t1, int i1));
};
Приспособление:
class TestFixture : public ::testing::Test
{
...
}
Имитация открытой функции:
int open(const char* t1, int i1)
{
return TestFixture::_fileHandlingMock->open(t1, i1);
}
Если я сделаю что-то подобное, все будет работать безупречно:
TEST_F(FileHandlingUnitTesting, openMatch)
{
EXPECT_CALL(*_fileHandlingMock, open("path_to_file", ::testing::Matcher<int>(1))).WillRepeatedly(::testing::Return(int(12)));
int a = open("path_to_file", 1);
}
Однако, если открытая функция вложена в другую функцию (где fcntl.h включен, сам код), макет никогда не будет вызван. Означает ли это, что ожидаемая «область действия» вызова ограничена самим TEST_F?
Вы можете обернуть все вызовы функций из fctnl.h в абстрактный класс и сделать из него два дочерних: реализация, которая вызывает реальные функции fcntl.h, и макет, который является просто классом GMock.
@Yksisarvinen, спасибо за ваш вклад. Действительно, ваш второй ответ соответствует решению моей проблемы, о чем я тоже думал.





Не уверен, что понимаю ваш вопрос. Похоже, ваша проблема в двойном определении функции
open(). Я полагаю, вы не используете#include <fcntl.h>в своей тестовой функции, иначе он не должен компилироваться. Здесь происходит следующее: когда вы вызываете свою функцию вручную в тесте, вызывается ваша собственная реализация. Но ваш производственный код не знает о существовании вашей собственной реализации и всегда использует для своих целей<fcntl.h>. Что вам следует сделать: измените свой производственный код, чтобы добавить в него макет (может пригодиться шаблон проектирования оболочки).