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

时间:2018-02-06 07:09:40

标签: c++ googletest gmock

标题有点令人困惑,所以让我解释一下。

我有以下代码: 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框架测试我的包?

1 个答案:

答案 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))))
))));

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