如何使用Google模拟测试构造函数

问题描述 投票:0回答:1

我想在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.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.cppclassA.h复制到mockclassA.cppmockclassA.h,然后更改

Handler d_handler;

MockHanlder d_hanlder;

并且在我的测试中,我将使用"mockclassA"而不是"classA"。但这将重复代码,并使代码难以维护。有没有更好的方法来测试我的构造函数?谢谢!

c++ unit-testing mocking googletest gmock
1个回答
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;
};
© www.soinside.com 2019 - 2024. All rights reserved.