gpt4 book ai didi

c++ - 使用 C++/Gmock 在中间模拟

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:17 25 4
gpt4 key购买 nike

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

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

我看到一篇文章http://www.ibm.com/developerworks/library/j-mocktest/index.html ,以“中间模拟”作为有趣的话题,但那是在 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};});

live demo


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


你可以用AbstractBFactoryBFactoryMockBFactory等复杂的方式来实现,但是开销太大而且看起来像Java。 ..

关于c++ - 使用 C++/Gmock 在中间模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24295452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com