Вы не можете смоделировать не виртуальную функцию, используя наследование. Вам нужно будет определить фиктивный класс, который реализует функции, необходимые для тестируемого кода, а затем найти способ заменить конкретный класс фиктивным классом. Подробнее об этом здесь .
Если честно, я понятия не имею, каков результат этого static_cast
, но, вероятно, это не хорошо.
Единственное Я могу думать о том, чтобы сделать то, что вы хотите сделать без изменения производственного кода , - это использовать другой путь включения в вашем тестовом проекте, который позволил бы полностью заменить бетон class B
на макет class B
. Это может или не может быть возможным, в зависимости от того, как структурирован ваш производственный код.
Если вам посчастливилось определить class B
в отдельном заголовочном файле, то это просто: создайте фиктивный заголовочный файл с тем же именем, но другой папкой, и убедитесь, что папка отображается в пути включения перед расположением файла заголовка производства.
Файл B.h
производства (в исходном местоположении и без изменений):
class B
{
public:
void function_from_b() {}
};
Файл B.h
(в месте расположения тестового кода):
class B
{
public:
MOCK_METHOD(void, function_from_b, ());
};
Где-то в рабочем коде (без изменений):
#include "B.h" // Will load original or mock depending on include path
class A
{
public:
A(B *b)
{
m_b = b;
}
void function_from_a_to_test(int arg)
{
if (m_b)
m_b->function_from_b();
else
; //something to do
}
private:
B *m_b;
}
Код теста:
TEST(A_Test, Test_function_from_a_to_test)
{
B b;
A a(&b);
EXPECT_CALL(b, function_from_b)
.Times(1);
a.function_from_a_to_test(0);
}