【发布时间】:2016-08-30 06:35:30
【问题描述】:
我有一个类是我无法控制的外部类的子类。外部类依赖于系统资源。例如
class MyClass : public ExternalBase // This class is from external framework and framework requires it to derive from this class.
{
int doSomePrivateThing(int );
public:
virtual int DoSomething(int );
virtual ~MyClass();
}
int MyClass::doSomePrivateThing(int )
{
// do some private task
}
int MyClass::DoSomething(int n)
{
// Do MyClass Specific task
int k = doSomePrivateThing(n);
return ExternalBase::DoSomething(k); // This function depends on external system resources.
// Probably try to communicate with remote server
// or attempt access Storage or Display device etc.
}
MyClass::~MyClass()
{}
如何打破 MyClass 的依赖并为 MyClass::DoSomething() 编写单元测试。使用组合代替继承不是一种选择,因为框架需要从这个基类派生类。
我正在使用 C++ 和 GoogleTest/Mock。但任何通用的解决方案都值得赞赏。
提前致谢。
【问题讨论】:
-
@SergeyA 我不能就这样放弃。我不能做一些宏和/或模板技巧来打破依赖关系吗?我有一个想法,但我不确定它是否好。我会将其发布为答案。但是如果其他人有更好的想法,我正在等待其他人。
-
我的经验是使用 CppUTest,所以这些条款可能会被取消。但最好的办法是检查 MyClass::DoSomething 在外部调用之前是否按预期运行,此时您可以测试您是否按照预期传递了它。在 CppUTest 中,这是通过模拟完成的,我不确定 GoogleTest 等效项是什么。
-
@SergeyA 你说得对,我不能在这里真正应用宏和/或模板魔法。我试图模板化基类,以便我可以向它提供一个模拟。但它没有用。
-
@Aumnayan GoogleTest 有模拟。而您期望来自 MyClass::DoSomething() 的外部调用的想法似乎是唯一的方法。这当然意味着我需要外部类的源代码才能知道它会进行哪些外部调用。如果它调用任何静态或全局函数,那么我们将再次注定失败。
标签: c++ unit-testing mocking googletest