4

给定接口

class IFooable {
  virtual void Fooable() = 0;
};

class IFoo {
  virtual void Foo(IFooable* pFooable) = 0;
};

和 goole mock

class TMockFoo : public IFoo {
  MOCK_METHOD1(Foo, void (IFooable*));
};

指定调用Fooable()模拟方法参数的操作的最简单方法是Foo()什么?

我试过了

TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WithArg<0>(Invoke(&IFooable::Fooable));

但这不会编译,因为Invoke()有一个参数需要一个自由函数,而不是成员函数。

使用boost::bind应该可能工作,但不一定会使代码太可读。在我写一个 custom 之前Action,我想检查一下我是否没有遗漏一些非常明显的东西。

4

3 回答 3

1

我无法测试它,因为我没有安装 Google Mock,但它似乎Invoke有另一个重载,带有两个参数,对象和方法指针,所以它会是:

IFooable* ifooable = new IFooableImpl(...);
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WithArg<0>(Invoke(&ifooable,&IFooable::Fooable));
于 2011-08-23T12:19:14.390 回答
1

我找不到简单的方法,最后解决了

TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WillByDefault(Invoke(boost::mem_fn(&IFooable::Fooable)));
于 2011-08-26T10:24:50.353 回答
0

调用成员函数的最简单方法是使用 lambda:

   TMockFoo MockFoo;
   ON_CALL(MockFoo, Foo(_))
      .WithArg<0>(Invoke([](IFooable * pFooable) { pFooable->Fooable(); }));
于 2018-04-23T18:03:57.453 回答