期望以确切的对象实例作为参数调用
Expect call with the exact object instance as argument
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
是否使用了由 myFunction1
返回的 MyClass
的确切实例。但是这段代码也通过了:
TEST_F(/* ... */)
{
MyMock myMock;
MyClass myObject1;
MyClass myObject2;
EXPECT_CALL(myMock, myFunction1()).WillOnce(Return(myObject1));
EXPECT_CALL(myMock, myFunction2(myObject2));
}
所以显然第二个 EXPECT_CALL()
只检查 myFunction2
是否被任何与 myObject2
具有相同值的 MyClass
对象调用,而不检查它是否是同一个实例这也可能是一个有效的测试,但它测试了不同的(更一般的?)行为。
如何检查是否是同一个实例?
我之前评论的答案:您的函数不使用 references/pointers,而是一个副本(因此无法比较两个副本的地址)。 myFunction1
和 myFunction2
都必须使用 references/pointers 才能进行比较。以下示例测试您的初始设置。
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!
}
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
是否使用了由 myFunction1
返回的 MyClass
的确切实例。但是这段代码也通过了:
TEST_F(/* ... */)
{
MyMock myMock;
MyClass myObject1;
MyClass myObject2;
EXPECT_CALL(myMock, myFunction1()).WillOnce(Return(myObject1));
EXPECT_CALL(myMock, myFunction2(myObject2));
}
所以显然第二个 EXPECT_CALL()
只检查 myFunction2
是否被任何与 myObject2
具有相同值的 MyClass
对象调用,而不检查它是否是同一个实例这也可能是一个有效的测试,但它测试了不同的(更一般的?)行为。
如何检查是否是同一个实例?
我之前评论的答案:您的函数不使用 references/pointers,而是一个副本(因此无法比较两个副本的地址)。 myFunction1
和 myFunction2
都必须使用 references/pointers 才能进行比较。以下示例测试您的初始设置。
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!
}