【发布时间】:2016-06-19 14:20:59
【问题描述】:
这与How to use gmock to test that a class calls it's base class' methods 密切相关,但我很难通过我的示例来实现这一点。
我正在使用 GTest 和 GMock 来测试一个新功能,所以我有一个基类...
class SimpleObject
{
public:
explicit SimpleObject() {}
virtual void moveX(int dX)
{
// Do important stuff like updating position, bounding box etc.
}
// ...
};
基于其他 TDD,我有一个派生类,新功能是,当我在派生对象上调用 moveX 时,它会做一些特定的事情,但是它还需要在 SimpleObject::moveX 中做重要的事情。
我已经有与 SimpleObject::moveX 函数相关的测试驱动单元测试,所以我不想为派生类重复它们。只要我知道 SimpleObject::moveX 被调用,那么一切都很好。
无论如何,基于上面的链接和遵循 TDD,我最终得到了以下结果。
派生类:
class ComplexObject : public SimpleObject
{
public:
virtual void moveX(int dX)
{
// Do something specific
}
};
“可测试”类:
class TestableComplexObject : public ComplexObject
{
public:
MOCK_METHOD1(moveX, void(int dX));
void doMoveX(int dX)
{
SimpleObject::moveX(dX);
}
};
测试:
TEST_F(ATestableComplexObject, CallsBaseClassMoveXWhenMoveXIsCalled)
{
int dX(8);
TestableComplexObject obj;
EXPECT_CALL(obj, moveX(dX))
.Times(1)
.WillRepeatedly(testing::Invoke(&obj, &TestableComplexObject::doMoveX));
obj.moveX(dX);
}
如果我运行测试,那么一切都会通过。这是不正确的,因为您可以看到 ComplexObject::moveX 没有做任何事情。
此外,无论我在 doMoveX 中添加了什么(我认为这是为了建立我的期望),测试仍然会通过。
我显然在这里遗漏了一些简单的东西,所以有什么想法吗?
【问题讨论】:
标签: c++ unit-testing tdd googletest googlemock