Нельзя издеваться b
как есть. Вам нужно будет использовать Внедрение зависимостей .
Сначала вам нужно будет указать базовый класс (или интерфейс) и получить NetworkClass
и NetworkClassMock
из INetworkClass
. Затем вы можете передать необработанный указатель (лучше умный указатель, такой как std :: unique_ptr ) или ссылку на class A
. Этим вводом может быть либо ваша реальная реализация NetworkClass
, либо ваша имитация NetworkClassMock
.
См. Этот пример:
#include <iostream>
class INetworkClass
{
public:
virtual void doSomething() = 0;
};
class NetworkClass : public INetworkClass
{
public:
void doSomething() override {std::cout << "Real class" << std::endl;} ;
};
class NetworkClassMock : public INetworkClass
{
public:
void doSomething() override {std::cout << "Mock class" << std::endl;};
};
class A
{
public:
A(INetworkClass& b) : b(b) {};
~A() {};
void func1() {b.doSomething();};
private:
// How do I mock this
INetworkClass& b;
};
int main(){
NetworkClass real_class;
NetworkClassMock mock_class;
A a1(real_class);
A a2(mock_class);
a1.func1();
a2.func1();
return 0;
}
Если вы просто хотите получить доступ к личному члену, например, для чтенияЭто значение после выполнения некоторых тестов, вы должны изменить свой код. Доступ к закрытым членам за пределами вашего класса не является хорошим дизайном. Если вы все еще хотите сделать это, вы можете проверить этот ответ (написанный для C # вместо C ++, но все еще пригодный для использования).
PS Чтобы использовать ключевое слово override, вам нужно будет скомпилировать с C ++11 поддержка.