Ожидайте вызов с точным экземпляром объекта в качестве аргумента - PullRequest
0 голосов
/ 04 марта 2019
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));
}

Так что, очевидно, 2-й EXPECT_CALL() проверяет, только ли myFunction2 вызывается с любым MyClass объектом, имеющим то же значение, что и myObject2, а не, если этотот же экземпляр, который также может быть допустимым тестом, но он проверяет другое (более общее?) поведение.

Как я могу проверить, является ли это тот же экземпляр?

1 Ответ

0 голосов
/ 04 марта 2019

Ответ из моего предыдущего комментария: ваши функции используют не ссылки / указатели, а копию (поэтому невозможно сравнить адрес обеих копий).myFunction1 и myFunction2 оба должны использовать ссылки / указатели для сравнения.В следующем примере проверяется ваша первоначальная настройка.

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!
}
...