gpt4 book ai didi

c++ - 如何在 GMock 中使用带有测试夹具的模拟?

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

我的测试中有一个测试夹具,所以我不必重复实例化我的类的对象,但我不确定如何使用它进行模拟。简单来说,类是这样定义的:

class Class1 {
public:
Class1(std::shared_ptr<Class2> class_two);
void doThisThing() { doThatThing(); }
}

class Class2 {
public:
Class2(Class3* class3_ptr);
int doThatThing();
}

(类 1 使用指向类 2 的共享指针构造。类 2 使用指向类 3 的指针构造。类 1 调用函数“doThisThing”,该函数调用类 2 的函数 doThatThing。)

我需要为 doThatThing()(以及 Class2 的其余函数)创建模拟对象,但无法弄清楚如何将模拟对象传递给类 1。以下是我目前在测试代码中的内容:

class TestClass1 : public ::testing::Test {
TestClass1(){
//Construct instance of Class1 and store as member variable
std::shared_ptr<Class3> class_three = std::make_shared<Class3>();
std::shared_ptr<Class2> class_two = std::make_shared<Class2>((Class3*)class_three.get());
class_one = new Class1(class_two);
};
Class1* class_one;
}

MockClass2 : public Class2 {
MOCK_METHOD0(doThatThing, int());
}

TEST_F(TestClass1, doThatThingTest){
MockClass2 mockObj;

**THIS IS WHERE I'M STUCK. How do I get that mockObj into my TestClass1 Fixture? As of now, it is calling the actual function, not the mock***

class_one->doThatThing();
EXPECT_CALL(mockObj, doThatThing());
}

我不得不抽象和简化实际代码,所以我希望上面的内容有意义。

最佳答案

假设您的 MockClass2 可以正常工作,您应该尝试以下操作:

在这里,您应该覆盖在每次调用测试函数之前调用的函数 SetUp 以准备您的测试数据。并覆盖每次调用测试函数后调用的 TearDown 以清理测试数据。

struct TestClass1 : public ::testing::Test
{
void SetUp() override
{
class_two_mock = std::make_shared<MockClass2>();
class_one = std::make_unique<Class1>(class_two_mock);
}
void TearDown() override
{
class_one.reset();
class_two_mock.reset();
}

std::shared_ptr<MockClass2> class_two_mock
std::unique_ptr<Class1> class_one;
};

在测试函数中,您必须在执行某些操作之前声明您的期望。

TEST_F(TestClass1, doThatThingTest)
{
EXPECT_CALL(*class_two_mock, doThatThing());

class_one->doThatThing();
}

您可能需要 Class2 的接口(interface)。这里的代码没有经过测试。

关于c++ - 如何在 GMock 中使用带有测试夹具的模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58940688/

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