1

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

1 回答 1

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

现场演示


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


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

于 2014-06-18T22:20:40.237 回答