标题有点令人困惑,所以让我解释一下。
我有以下代码: File.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);
}
File.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框架测试我的包?
答案 0 :(得分:1)
我设法找到了解决这个问题的方法。
我所做的是宣布将首先在每个“第二”对象中测试正确数据的单独匹配器:
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))))
))));
希望这会对某人有所帮助。