使用c++ /Gmock进行中间模拟

Mock in the Middle with C++/Gmock

本文关键字:中间 模拟 Gmock c++ 使用      更新时间:2023-10-16

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

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

我看到了一篇文章http://www.ibm.com/developerworks/library/j-mocktest/index.html,其中"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();
    }
}; 

可以使用工厂模式


给定此代码

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};});

现场演示


你也可以使b_maker成为一个全局变量,这样你就不需要传递它(但我不建议给它)


您可以使用AbstractBFactory, BFactory, MockBFactory的复杂方法来完成,但它的开销太大,看起来像Java…