用C ++ / Gmock模拟中间

时间:2014-06-18 21:41:13

标签: c++ unit-testing gmock

我有一个A类,它在构造函数中实例化了一个B类对象。我想用B的模拟对象测试A.

不,我不能将B的对象作为参数传递。还有其他办法吗?

我看到了一篇文章http://www.ibm.com/developerworks/library/j-mocktest/index.html,其中包含#34; Mock in the Middle"作为有趣的话题,但那是在Java中。在C ++中可以吗?

class B {...};

class A {
  private:
    B* b;

  public:
    A() {
        b = new B();
    }
    ~A() {..}
};

编辑:

通常,可以根据需要以某种其他方法创建对象。例如,

class A {
    ...
    int doSomething() {
        // Create an object of class B
        b = new B();
    }
}; 

1 个答案:

答案 0 :(得分:1)

您可以使用工厂模式


给出此代码

class B {
  public:
    virtual std::string name() { return "B::name"; }
    virtual ~B() {}
};

class A {
  private:
    std::unique_ptr<B> b;

  public:
    A() {}
    void createB() {
        b.reset(new B); // you want to replace `new B` with something else right?
    }
    void print() {
        std::cout << (b ? b->name() : std::string()) << std::endl;
    }
    ~A() {}
};

带工厂功能的

class A {
  private:
    std::unique_ptr<B> b;

  public:
    std::function<std::unique_ptr<B>()> b_maker;

    A() {
        // default maker
        b_maker = []{ return std::unique_ptr<B>(new B); };
    }

    A(std::function<std::unique_ptr<B>()> func) {
        b_maker = func;
    }

    void createB() {
        b = b_maker();
    }

    void print() {
        std::cout << (b ? b->name() : std::string()) << std::endl;
    }
    ~A() {}
};

创建A,默认B是相同的

A();

现在你可以用

提供模拟B.
A([]{return std::unique_ptr<B>{new MockedB};});

live demo


你也可以让b_maker成为一个全局变量,所以你不需要传递它(但我不推荐它)


你可以使用AbstractBFactoryBFactoryMockBFactory的复杂方式来实现它,但它的开销太大,看起来像Java ......