期望使用确切的对象实例作为参数进行调用

问题描述 投票:0回答:1
class MyClass
{
    public:
    int state;
};

class SomeClass
{
    virtual MyClass myFunction1() = 0;
    virtual void myFunction2(MyClass) = 0;
};

class MyMock : public SomeClass
{
public:
    MOCK_METHOD0(myFunction1, MyClass());
    MOCK_METHOD1(myFunction2, void(MyClass));
};

TEST_F(/* ... */)
{
    MyMock myMock;
    MyClass myObject;
    EXPECT_CALL(myMock, myFunction1()).WillOnce(Return(myObject));
    EXPECT_CALL(myMock, myFunction2(myObject));
}

当我写这段代码时,我以为我正在测试myFunction2是否正在使用MyClass返回的myFunction1的确切实例。但是这段代码也通过了:

TEST_F(/* ... */)
{
    MyMock myMock;
    MyClass myObject1;
    MyClass myObject2;
    EXPECT_CALL(myMock, myFunction1()).WillOnce(Return(myObject1));
    EXPECT_CALL(myMock, myFunction2(myObject2));
}

所以显然第二个EXPECT_CALL()只检查myFunction2是否被调用任何与MyClass具有相同值的myObject2对象,而不是它是同一个实例,它也可能是一个有效的测试,但它测试一个不同的(更一般?)行为。

如何检查它是否是同一个实例?

c++ googletest googlemock
1个回答
1
投票

我之前的评论回答:你的函数不使用引用/指针,而是使用副本(因此无法比较两个副本的地址)。 myFunction1myFunction2都必须使用引用/指针才能进行比较。以下示例测试您的初始设置。

class SomeClass
{
    virtual MyClass* myFunction1() = 0; // pointer!
    virtual void myFunction2(MyClass*) = 0; // pointer!
};

TEST_F(/* ... */)
{
    MyMock myMock;
    MyClass myObject;
    EXPECT_CALL(myMock, myFunction1()).WillOnce(Return(&myObject)); // dereference!
    EXPECT_CALL(myMock, myFunction2(&myObject)); // dereference!
}
© www.soinside.com 2019 - 2024. All rights reserved.