使用依赖注入模拟C++类

Jon*_*han 2 dependency-injection mocking googlemock

假设你要测试的类A,它有一个依赖注入B具有的依赖注入C.
所以,你嘲笑B,但它唯一的构造函数需要的注射C,所以你有嘲笑C以及和注入嘲笑C成嘲笑B才把它注入到A
如果您有5个连续的依赖项怎么办?

有哪些替代方案?

我使用谷歌模拟,所以一个具体的答案也会有所帮助.

mik*_*ong 6

Emile有正确的想法,你应该依赖于接口而不是具体的类.所以在你的例子中它将是这样的:

#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;
}
Run Code Online (Sandbox Code Playgroud)

在你的测试中你创建了一个模拟B,它不依赖于任何类C.然后你只用B测试接口.这样你就打破了A对C的依赖.创建一个不依赖于C的模拟B很漂亮简单:

class MockB : public B {
 public:
  MOCK_METHOD0(doSomething, void());
};
Run Code Online (Sandbox Code Playgroud)