首页 > 解决方案 > gMock upcasting 在 EXPECT_CALL 上失败

问题描述

我遇到了使用 Gmock 进行 UpCasting 的问题

#include "gtest/gtest.h"
#include "gmock/gmock.h"

using namespace testing;
using namespace std;

class MyClass {
public:
    MyClass(int xxx) {}
    int call(int x) {

    };
};

class MockMyClass : public MyClass {
public:
    MockMyClass(int xxx) : MyClass(xxx) {};
    MOCK_METHOD1(call, int(int));
};

TEST(TestMyClass, worksFine) {
    MockMyClass mock(111);

    EXPECT_CALL(mock, call(_))
            .WillOnce(Return(2000)); // times(1) by default;

    mock.call(23);
}

TEST(TestMyClass, doesntWork) {
    MockMyClass mock(111);
    MyClass &myClassNotMock = mock;

    EXPECT_CALL(mock, call(_))
            .WillOnce(Return(2000)); // times(1) by default;

    myClassNotMock.call(23);
}

我曾尝试使用指针,它看起来是同样的问题。每次我有 Base 对象引用(从模拟向上转换)并且我在其上调用一个函数时,gmock 都不会拾取它。

我会很感激一些帮助

标签: c++googletestgmock

解决方案


好的,所以我设法找出问题所在。因为 MyClass 调用函数不是虚拟的,我必须使用Google Mock CookBook 模拟非虚拟方法中解释的模板技术,或者简单地为 MyClass 引入一个接口并正常模拟它


推荐阅读