Я новичок в Google Mock и, основываясь на своем понимании документации и сетевых ресурсов, я не смог найти решение своей проблемы:
У меня есть следующие классы:
class A
{
public:
A() { }
int fun1()
{
//Some code
B b;
x = b.fun2();
//Some other code
}
};
class B
{
public:
B() { }
int fun2()
{
//Some code
y = C::fun3();
//Some code
}
};
class C
{
public:
static int fun3()
{
//Read a file and provide success if a certain pattern is found
}
};
Сейчас я пытаюсь написать тест Google для A :: fun1 (). Но из-за структуры кода (все вызовы осуществляются через объекты, и у меня нет базового класса, с помощью которого я могу инициализировать макет и т. Д., Я не могу успешно смоделировать это.
Может кто-нибудь помочь мне понять, если это издевательство над Google Mock в его нынешнем виде? Обратите внимание, что мне не разрешено изменять исходный код.
Это можно сделать только до тех пор, пока тестируемый класс можно настроить с помощью статических интерфейсов (т. Е. Параметров шаблона). Смотрите здесь для более подробной информации: Насмешливые невиртуальные методы.
Другой альтернативой может быть введение интерфейсов-оболочек в тестируемый класс, которые можно смоделировать как обычно: Альтернатива насмешливым бетонным классам.
Если вы не можете изменить какой-либо код, это невозможно, ИМХО.
ОБНОВИТЬ:
Как долго class B
создается внутри A::fun1()
, будет трудно издеваться B
тем не мение. Он должен быть передан как параметр, таким образом, у вас есть возможность управлять созданием экземпляра в вашем методе тестирования.
Для вас может оказаться жизнеспособным решением подделать среду сборки для тестирования и предоставить объявление и определение для class B
это обеспечивает насмешку.
Других решений пока нет …