我有一个A类,它在构造函数中实例化了一个B类对象。我想用B的模拟对象测试A.
不,我不能将B的对象作为参数传递。还有其他办法吗?
我看到了一篇文章http://www.ibm.com/developerworks/library/j-mocktest/index.html,其中包含#34; 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();
}
};
答案 0 :(得分: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 ......