gpt4 book ai didi

unit-testing - 在 C++ 中使用 gmock 模拟具体类

转载 作者:行者123 更新时间:2023-12-04 04:12:16 25 4
gpt4 key购买 nike

我一直在为具体类创建模拟。

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

我的代码类似于:

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);
}

测试似乎通过,但我在静态转换时内存泄漏

如果我将静态转换的结果存储在另一个变量中(以便删除它),则具有该变量的 expect 调用将失败

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

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

最佳答案

您不能使用继承来模拟非虚函数。您将不得不定义一个模拟类来实现被测代码所需的功能,然后有办法用模拟类替换具体类。了解更多信息 here .

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

我能想到的唯一方法在不更改生产代码的情况下是在您的测试项目中使用不同的包含路径,这将允许完全替换具体的类B 与模拟 class B。这可能会也可能不会,具体取决于您的生产代码的结构。

如果你足够幸运,在单独的头文件中定义了 class B,那么很简单:制作一个同名但不同文件夹的模拟头文件,并确保该文件夹出现在生产头文件位置之前的包含路径中。

生产 B.h 文件(在原始位置且未修改):

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

模拟 B.h 文件(在测试代码位置):

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

生产代码中的某处(未修改):

#include "B.h" // Will load original or mock depending on include path

class A
{
public:
A(B *b)
{
m_b = b;
}

void function_from_a_to_test(int arg)
{
if (m_b)
m_b->function_from_b();
else
; //something to do
}

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);
}

关于unit-testing - 在 C++ 中使用 gmock 模拟具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61513826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com