如何测试从依赖于外部系统的外部基类派生的类
How to test classes that is derived from external base class which depends on external system
我有一个类,它是一个外部类的子类,我对它没有任何控制权。外部类依赖于系统资源。例如
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。但任何广义的解决方案都值得赞赏。
提前谢谢。
有两种方法。我称之为"稍微正确一点"的方式和"非常丑陋"的方式。
"更正确"的方式:
用一些可以部分模拟的附加层封装外部类函数。
class MyClass : public ExternalBase // This class is from external framework and framework requires it to derive from this class.
{
int doSomePrivateThing(int );
public:
virtual void BaseDoSomething(int) { return ExternalBase::DoSomething(v); }
virtual int DoSomething(int v);
virtual ~MyClass();
};
int MyClass::DoSomething(int n)
{
// Do MyClass Specific task
int k = doSomePrivateThing(n);
return BaseDoSomething(k);
}
以这种方式在UT中进行部分模拟:
class TestableMyClass : public MyClass
{
public:
using MyClass::MyClass;
MOCK_METHOD1(BaseDoSomething, int(int));
};
TEST(A,A)
{
TestableMyClass objectUnderTest;
EXPECT_CALL(objectUnderTest, BaseDoSomething(112));
objectUnderTest.DoSomething(112);
}
当您需要在测试中调用真正的基类方法时,请将WillOnce(Invoke...)
与EXPECT_call一起使用。
"非常丑陋"的方式:
提供您自己的ExternalBase的UnitTest实现,并将其链接到您的测试。ExternalBase的这种"UnitTest"实现应该基于一些全局Mocks对象。
ExternalBaseMock.hpp:
class ExternalBaseMock
{
public:
MOCK_METHOD1(DoSomething, int(int));
};
extern ExternalBaseMock externalBaseMock;
ExternalBaseMock.cpp:
ExternalBaseMock externalBaseMock;
int ExternalBase::DoSomething(int n)
{
return externalBaseMock.DoSomething(n);
}
然后你的测试:
#include "ExternalBaseMock.hpp"
TEST(A,A)
{
MyClass objectUnderTest;
EXPECT_CALL(externalBaseMock, DoSomething(112));
objectUnderTest.DoSomething(112);
}
相关文章:
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 错误处理.将系统错误代码映射到泛型
- 在函数内部的声明中初始化数组,并在外部使用它
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 使外部项目可用于find_package CMake
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在C++游戏中与库存系统作斗争
- C++:来自外部文件的Trivia
- 从函数角度看ID到文件路径的内部与外部映射
- 如果 copts 不允许系统路径,如何引用外部依赖项使用的系统库?
- 如何在Qt中打开外部应用程序并将其最小化到系统托盘
- 提升::系统::error_category处未解析的外部符号
- 如何测试从依赖于外部系统的外部基类派生的类
- 如何在Windows系统中使用Sublime Text在外部控制台中运行程序
- Boost文件系统库中未解析的外部符号(错误LNK2019)
- 链接Waf目标到由外部构建系统(CMake)生成的库
- 无法读取外部类型和资源系统的文件