C++ 在中间用C&XX2B模拟;x2B/格洛克

C++ 在中间用C&XX2B模拟;x2B/格洛克,c++,unit-testing,gmock,C++,Unit Testing,Gmock,我有一个类a,它在构造函数中实例化了类B的对象。我想用模拟对象B测试A 不,我不能把B的对象作为参数传递。还有别的办法吗 我看了一篇文章,其中“中间的Mock”是一个有趣的主题,但这是用Java写的。C++中是否可能?< /P> class B {...}; class A { private: B* b; public: A() { b = new B(); } ~A() {..} }; 编辑: 通常,可以根据需要使用其他方法创建对

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

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

我看了一篇文章,其中“中间的Mock”是一个有趣的主题,但这是用Java写的。C++中是否可能?< /P>
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() {}
};
现在你可以给模拟B提供

A([]{return std::unique_ptr<B>{new MockedB};});
A([]{return std::unique_ptr{new MockedB};});


您还可以将
b_maker
设置为全局变量,这样就不需要传递它(但我不建议这样做)



你可以用
AbstractBFactory
BFactory
MockBFactory
,用复杂的方法来实现,但是它的开销太大,看起来像Java…

你能创建一个新的构造函数吗。通常,可以根据需要创建对象,例如,在方法中。但是这是一个很好的观点,让我来编辑这个问题,让它更清楚。听起来你需要一个工厂对象/函数为你的B对象(或任何你需要的地方)添加一个带工厂的构造函数,并模仿它,当你想的时候,你能举个例子吗?因为如果我将工厂作为构造函数中的参数,那么实例化工厂的地方也需要实例化工厂,而这正是我试图避免的事情。看起来我最终不得不这样做。谢谢你的密码。
A();
A([]{return std::unique_ptr<B>{new MockedB};});