【问题标题】:Mock in the Middle with C++/Gmock使用 C++/Gmock 在中间模拟
【发布时间】:2014-06-18 21:41:13
【问题描述】:

我有一个 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();
    }
}; 

【问题讨论】:

  • 你能创建一个新的构造函数 take b 吗?
  • 我可以,但这是在类中创建对象的示例之一。通常,可以按需创建对象,例如在方法中。但这很好,让我编辑问题以使其更清楚。
  • 听起来你需要工厂对象/函数
  • 为您的 B 对象(或任何您需要的地方)添加一个带有工厂的构造函数,并根据需要模拟它
  • 你能举个例子吗?因为如果我在构造函数中将工厂作为参数,那么实例化 A 的地方也需要实例化该工厂,这就是我要避免的全部事情。

标签: c++ unit-testing gmock


【解决方案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......

【讨论】:

  • 看起来我最终不得不做这样的事情。感谢您的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2022-07-27
  • 2016-01-02
相关资源
最近更新 更多