如何解决用依赖注入模拟C ++类
| 假设您正在测试类A
,并且它的依赖项注入是B
,而依赖项注入是C
。因此您模拟了B
,但唯一的构造函数需要注入C
,所以您也必须模拟C
,并且将模拟的C
注入模拟的B
,然后再将其注入A
。如果您有5个连续的依赖关系,该怎么办?
有哪些选择?
我使用的是Google Mock,因此具体的答案也会有所帮助。解决方法
Emile有一个正确的想法,您应该依赖于接口而不是具体的类。因此,在您的示例中,它将类似于:
#include <iostream>
using namespace std;
class C {
public:
int x;
};
class B {
public:
~B(){};
virtual void doSomething() = 0;
};
class ConcreteB : public B{
public:
ConcreteB(C c) : m_c(c) {}
void doSomething(){
std::cout << \"HelloWorld\" << std::endl;
}
private:
C m_c;
};
class A{
public:
A(B *b): m_b(b){}
void functionToTestWithSideEffect(){
m_b->doSomething();
}
private:
B *m_b;
};
//#include <gmock/gmock.h>
int main() {
C c;
c.x = 42;
ConcreteB b(c);
A a(&b);
a.functionToTestWithSideEffect();
return 0;
}
在测试中,您将创建一个不依赖任何类C的模拟B。然后,您将仅使用B测试该接口。这样,您就可以打破A \对C的依赖。创建一个不依赖C的模拟B在C上非常简单:
class MockB : public B {
public:
MOCK_METHOD0(doSomething,void());
};
,如果更改设计以使类依赖于接口而不是具体的类,那么您将摆脱构造函数问题。除了提高可测试性之外,它还可以提高可重用性和可维护性,但需要更多的代码(接口)。,在这种情况下,您应该通过指针而不是通过引用进行注入,那么您可以传递NULL指针。假设您的对象确实是一个模拟对象而不是假对象,这将起作用,因此它对注入的对象没有真正的依赖性。
对于boost::shared_ptr
,您可以执行以下操作:
boost::shared_ptr<C> null_c_ptr;
MockB mock_b(null_c_ptr);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。