如何模拟派生类调用其基类方法?

时间:2019-06-25 09:15:36

标签: c++ googletest gmock

我正在对派生类进行单元测试,并且想EXPECT_CALL调用属于其基类的某个方法。

例如:

class Base {
public:
    void move(int x, int y);
};

class Derived: public Base{
public:
    RESULT update();

private:
    int age;
};

HRESULT Derived::update(void) {
    int param1 = 5, param2 = 10;
    move(param1, param2);
    age++;

    return SUCCESS;
}

我不能只为Derived创建一个模拟并期望move,因为没有依赖关系,实际的move()将被调用。

如何模拟move()?我的最终目标是我希望期望用正确的参数值(在这种情况下为param1 and param2)调用move()。

当然,这不是实际的代码,而只是一种表示形式

就UT而言,我知道这不是一个好的设计,但这是为了测试一些我不允许重新格式化的旧代码(但需要制作UT)。因此,能够模拟和测试move()是我真正拥有的最佳选择。

我们将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:4)

我认为不使用一些预处理技巧就没有任何办法。在测试中使方法虚拟化的这些技巧中,最不痛苦的是。 只需执行以下操作即可:

#if UNDER_TEST
#define TEST_VIRTUAL virtual
#else
#define TEST_VIRTUAL
#endif

class Base {
public:
    TEST_VIRTUAL void move(int x, int y);
};

然后您可以像这样模拟它:

class TestObject : public Derived {
public:
    MOCK_METHOD2(move, void(int x, int y));
};

TEST(Test, Testing)
{
    TestObject obj;
    EXPECT_CALL(obj, move(5, 10));
    obj.update();
}

答案 1 :(得分:2)

在此代码中没有进行模拟。您在这里没有任何外部依赖性。

对该代码的测试如下所示:

TEST(DerivedTest, WhenUpdateIsCalledPossitionIsChangedAndItGetsOlder)
{
    Derived foo;
    foo.age = 1;
    foo.update();
    EXPECT_EQ(10, foo.x);
    EXPECT_EQ(12, foo.y);
    EXPECT_EQ(2, foo.age);
}

告诉我为什么有理由在这里嘲笑什么?