对于在C ++中使用gmock的具体类进行模拟

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

我一直坚持为concrete class创建一个模拟。

我知道这样做不是一个好主意,但是不允许我更改生产代码

我的代码类似于:

Class A
{
public:
        A(B* b)
        {
                this->b = b;
        }
.........................
 void function_from_a_to_test(<arg>)
{
        if(!b)
                b->function_from_b();
        else
             //something to do
}
private:
        B * b;
};

class B
{
........
 public:       
        void function_from_b();
......
};
class MockB : public B , testing::Mock //i don't know why I can that, B is not virtual 
{

 MOCK_METHOD(function_from_b, void, (void));

};


A_Test :testing::Test{
 SetUp()
{
        b = new B();
        a = new A(b);
}

 TearDown()
{
        delete b ;
        delete a ;
}

void set_b(B * bb)
{
        a->b = bb;
}

.........................
}

In order to test I used Test_f

TEST_F(A_Test, Test_function_from_a_to_test)
{
//arrange

//act
 B * b_t = new MockB();
set_b(b_t);
EXPECT_CALL(*(static_cast<MockB> b_t), function_from_b))
        .Times(10);

function_from_a_to_test(arg);
}

似乎测试已通过,但我静态投射时出现了[[内存泄漏。

并且如果我将静态转换的结果存储在

另一个变量中(为了删除它),则具有该变量的期望调用为失败

我知道这不是很好的做法,但是我不能更改生产代码。

有人知道如何解决吗?还是更好的测试方法?

unit-testing c++11 gmock
1个回答
0
投票
您不能使用继承来模拟非虚函数。您将必须定义一个模拟类,该类可以实现被测代码所需的功能,然后才能用该模拟类替换具体的类。进一步了解here

老实说,我不知道static_cast的结果是什么,但是可能不好。

我唯一想做的事情而无需更改生产代码的方法是在测试项目中使用其他包含路径,该路径将允许用模拟class B完全替换具体的class B

[如果您有幸在自己的.h文件中定义了类B,那么很容易:制作另一个具有相同名称的.h文件,将其放在单独的include文件夹中,并确保该文件夹出现在在真正的.h文件之前包含路径。

生产B.h文件:

class B { public: void function_from_b() {} };

测试B.h文件:

class B { public: MOCK_METHOD0(function_from_b, void()); };

生产代码中的某处:

#include "B.h" class A { public: A(B *b) { m_b = b; } private: B *m_b; }

测试代码:

TEST(A_Test, Test_function_from_a_to_test) { B b; A a(&b); EXPECT_CALL(b, function_from_b) .Times(1); a.function_from_a_to_test(0); }

© www.soinside.com 2019 - 2024. All rights reserved.