gpt4 book ai didi

c++ - 是否可以使用 GMock 测试由不同对象组成的对象?

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

标题有点乱,我解释一下。

我有以下代码:文件.cpp

bool Foo::MyFunction()
{

struct myStruct;

FirstObject firstObject;
{
firstObject.setFirstValue(myStruct.Criticality);
firstObject.setSecondValue(myStruct.Distance_X, myStruct.Distance_Y);
firstObject.setThirdValue(myStruct.Distance_Z);
}

SecondObject secondObject;
{
secondObject .setFirstValue(myStruct.Criticality);
secondObject .setSecondValue(myStruct.Distance_X, myStruct.Distance_Y);
secondObject .setThirdValue(myStruct.Distance_Z);
}

TargetObject package;
package.setFirstObject(firstObject);
package.setSecondObject(secondObject );

setDataPackage(package);

}

文件.h

class Foo
{
public:
MyFunction();

private:
template <typename T>
void setDataPackage(T& package)
{
if (mDataConnector != nullptr)
{
mDataConnector->dataUpdated(package);
}
else
{
//other stuff
}
setDataPackage_Override(package);
}
}

如您所见,我的函数是一个模板,因此模拟它并将其用于我的测试的唯一方法是声明另一个函数 (setDataPackage_Override),该函数将在内部使用正确类型的参数调用。

模拟类:

class MockFoo : public Foo
{
public:

MOCK_METHOD1(setDataPackage_Override, void (AnotherClass::FirstTypeOfPackage& package));
MOCK_METHOD1(setDataPackage_Override, void (AnotherClass::SecondTypeOfPackage& package));
MOCK_METHOD1(setDataPackage_Override, void (AnotherClass::ThirdTypeOfPackage& package));


};

我需要测试的是包的每个字段是否设置正确。我一开始会设置结构体的所有值,我想检查包里的内容是不是我设置的。我的问题是我不知道如何一直获取值(例如 myStruct.Criticality),因为它们不是直接设置在我的包中,而是先设置在一个对象中,然后再提供给包。

我有一个类似的例子:

bool Foo::MyFunction()
{

struct myStruct;
int value = myStruct.targetValue;
TargetObject package;
package.setValue(value );

setDataPackage(package);
}

我是这样测试的:

我用值填充了我的结构,为了这个测试,假设 myStruct.targetValue 等于 20

EXPECT_CALL( *mockFoo, setDataPackage(
testing::Property( &Class::getValue,
testing::Eq(int (20)))));

提及:我所有的 set 函数都实现了它们的 get 函数。

有没有办法使用 Gmock 框架测试我的包?

最佳答案

我设法找到了解决这个问题的方法。

我所做的是声明单独的匹配器,这些匹配器将首先测试每个“第二”对象内的正确数据:

MATCHER_P(checkGetCriticality_getFirstValue,      value , " ") { return (arg.Class::FirstObject::getFirstValue()      == value); }
MATCHER_P(checkGetPointFront_getSecondValue, value , " ") { return (arg.Class::FirstObject::getSecondValue() == value); }
MATCHER_P(checkGetDistanceRearZ_getThirdValue, value , " ") { return (arg.Class::FirstObject::getThirdValue() == value); }

然后传递这些匹配器并检查“主要”对象:

EXPECT_CALL( *mockFoo, setDataPackage(Matcher<AnotherClass::FirstTypeOfPackage&>( 
AllOf(
//getEgoOneDtrObj
(testing::Property(&Class:TargetObject::getValue, checkGetCriticality_getFirstValue (uint8_t(100)))),
(testing::Property(&Class:TargetObject::getValue, checkGetPointFront_getSecondValue (double(200)))),
(testing::Property(&Class:TargetObject::getValue, checkGetDistanceRearZ_getThirdValue (double(8190))))
))));

希望这会对某人有所帮助。

关于c++ - 是否可以使用 GMock 测试由不同对象组成的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48637334/

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