我正在尝试使用Google Mock测试抽象类。遵循forDummies指南,我构造了类(class)的模拟:

AbstractFoo.h

class AbstractFoo {
public:
  virtual void setSize(int w, int h) = 0;
  void setSize(const QSize& s); // implemented as calling above function
}

MockFoo.h
#include "gmock/gmock.h"
class MockFoo : public AbstractFoo {
public:
  MOCK_METHOD2(setSize, void(int w, int h));
}

FooTest.cpp
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "MockFoo.h"

TEST(AbstractFoo, MethodSetSize) {
  MockFoo foo;
  EXPECT_CALL(foo, setSize(5, 5)).Times(1);
  foo.setSize(QSize(5, 5)); // this line produces compiler error
}

标记的行产生以下编译器错误:



我的理解是,由于MockFoo扩展了AbstractFoo,因此它应该继承setSize(QSize)方法。但是,事实并非如此。我怎样才能解决这个问题?

针对代码错误进行编辑

最佳答案

模拟类中方法的签名错误:

MOCK_METHOD2(setSize, bool(int w, int h));

基类具有带有此签名的方法:
virtual void setSize(int w, int h) = 0;

我不确定您使用的是哪个编译器,但这应该是编译器错误。

修复签名,错误应该消失:
MOCK_METHOD2(setSize, void(int w, int h));

另外,
class MockFoo : AbstractFoo

应该
class MockFoo : public AbstractFoo

您的问题与googlemock库无关,而与c++无关。由于[class.virtual] / 1,您无法实现的目标。

下一个示例演示了相同的问题:
struct A
{
    A(int h,int l):x(h),y(l){}
    int x; int y;
};

class AbstractFoo {
public:
    virtual void setSize(int w, int h) = 0;
    void setSize(const A& s){setSize(s.x,s.y);}
};

class MockFoo : public AbstractFoo
{
public:
    void setSize(int , int ){}
};

int main()
{
    MockFoo f;
    A a(5,5);

    f.setSize( a );
}

您可以通过重命名setSize(const QSize& s)方法或将MockFoo对象转换为AbstractFoo&然后调用此方法来解决此问题。

您还可以查看NVI,因为它看起来像您尝试做的那样。

关于c++ - 在Google Mock上调用重载函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17540986/

10-14 07:10