У Эмиля правильная идея, вы должны зависеть от интерфейсов, а не от конкретных классов. Так что в вашем примере это будет что-то вроде:
#include <iostream>
using namespace std;
class C {
public:
int x;
};
class B {
public:
~B(){};
virtual void doSomething() = 0;
};
class ConcreteB : public B{
public:
ConcreteB(C c) : m_c(c) {}
void doSomething(){
std::cout << "HelloWorld" << std::endl;
}
private:
C m_c;
};
class A{
public:
A(B *b): m_b(b){}
void functionToTestWithSideEffect(){
m_b->doSomething();
}
private:
B *m_b;
};
//#include <gmock/gmock.h>
int main() {
C c;
c.x = 42;
ConcreteB b(c);
A a(&b);
a.functionToTestWithSideEffect();
return 0;
}
В своих тестах вы создаете макет B, который не зависит от какого-либо класса C. Затем вы тестируете интерфейс только с B. Таким образом вы нарушаете зависимость A от C. Создание макета B, который не зависит от С довольно прост:
class MockB : public B {
public:
MOCK_METHOD0(doSomething, void());
};