我想在classA中使用构造函数和处理程序对构造函数和其他函数进行更改,我想使用gmock对其进行测试。
这是classA.cpp中的构造函数:
classA(const std::string str)
:d_handler(str){
if (!d_handler.functionA()){
throw someError("failure to use functionA");
}
在classA中还有一个setHandler函数:
void setHandler(Handler& handle){
d_handler = handle;
}
在class A.h中:
classA(const std::string str=std::string("sth for default")); // constructor
Handler d_handler; // classA member handler
因此classA使用处理程序。 在handler.h中,有一个我可以模拟的“ functionA()”虚拟函数:
virtual bool functionA() const;
我有一个用于处理程序的模拟类:
class MockHandler: public Handler{
public:
MockHandler():Handler("sth for default") {} // mockHandler constructor, same as Handler
MOCK_CONST_METHOD0(functionA, bool()); // the function i want to mock
};
除构造函数外,我可以使用模拟的处理程序测试classA中的任何函数。就像在test.t.cpp中一样:
TEST(Sometest, 1)
{
MockHandler mock;
classA instanceA;
instanceA.setHanlder(mock);
// then i can use my mocked handler do whatever i want to mock
}
但是我无法使用这种方式测试构造函数,因为它直接在构造函数中初始化了原始处理程序。而且我不想更改classA中的现有功能,但是可以在classA中添加新功能。如何测试我的构造函数?我可以考虑的一种方法是将整个classA.cpp
和classA.h
复制到mockclassA.cpp
和mockclassA.h
并进行更改
Handler d_handler;
到
MockHanlder d_hanlder;
,在我的测试中,我将使用"mockclassA"
而不是"classA"
。但这将重复代码,并使代码难以维护。有没有更好的方法来测试我的构造函数?
谢谢!
答案 0 :(得分:0)
您的类A应该采用带有处理程序的构造函数(其他构造函数可能委托给此构造函数):
class ClassA
{
public:
classA(const std::string& str) : classA(std::make_unique<Handler>(str)) {}
classA(std::unique_ptr<IHandler> handle) : d_handler(std::move(handle))
{
if (!d_handler->functionA()){
throw std::runtime_error("failure to use functionA");
}
//...
}
void setHandler(std::unique_ptr<IHandler> handle){ d_handler = std::move(handle); }
private:
std::unique_ptr<IHandler> d_handle;
};