gmock-如何使用noexcept说明符模拟函数

时间:2019-07-15 21:23:32

标签: c++ googletest gmock

我需要模拟以下功能:

 virtual void fun() noexcept = 0;

是否可以使用gmock?

Gmock具有以下宏:#define GMOCK_METHOD0_(tn, constness, ct, Method, ...),但有一条注释:// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!而且我不知道如何使用该宏(参数tn和ct表示什么)?

修改

以下模拟:

GMOCK_METHOD0_(, noexcept, ,fun, void());

使用gmock 1.7.0进行编译,但是当我使用gmock 1.8.1进行编译时,出现编译错误:

main.cpp:17: error: expected identifier before ‘noexcept’
 GMOCK_METHOD0_(, noexcept, ,fun, void());
                  ^
gmock-generated-function-mockers.h:153: in definition of macro ‘GMOCK_METHOD0_’
   constness ::testing::internal::Function<__VA_ARGS__>* ) const { \
   ^
main.cpp:17: error: expected ‘,’ or ‘...’ before ‘noexcept’
 GMOCK_METHOD0_(, noexcept, ,fun, void());
                  ^
gmock-generated-function-mockers.h:153: in definition of macro ‘GMOCK_METHOD0_’
   constness ::testing::internal::Function<__VA_ARGS__>* ) const { \
   ^
main.cpp:-1: In member function ‘testing::internal::MockSpec<void()> MockX::gmock_fun(const testing::internal::WithoutMatchers&, int) const’:

gmock-generated-function-mockers.h:154: error: ‘AdjustConstness_noexcept’ is not a member of ‘testing::internal’
     return ::testing::internal::AdjustConstness_##constness(this)-> \
            ^
main.cpp:17: in expansion of macro ‘GMOCK_METHOD0_’
 GMOCK_METHOD0_(, noexcept, ,fun, void());
 ^

3 个答案:

答案 0 :(得分:2)

现在,从v1.10.0开始,使用新语法就可以做到这一点。 参见change lognew syntax explanation

新语法包含一个单独的参数规范以传递限定符

class MyMock {
   public:
      MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...));
};

答案 1 :(得分:2)

在较旧的模拟版本上,可以通过简单的技巧来解决此类c ++装饰:

  1. 创建没有 noexcept
  2. 的模拟方法
  3. 创建具有正确签名的代理方法,该方法将调用模拟方法

在您的示例中应该是

class Mock : public MyInterface
{
public:
  MOCK_METHOD0(funImpl, void());
  virtual void fun() noexcept
  {
    funImpl();
  }
};

使用相同的模式,您可以使用auto_ptr之类的方法接受非gockock友好的参数来模拟方法。您还可以创建包装函数,并将参数更改为包装器内部对gmock友好的参数(例如shared_ptr)。

答案 2 :(得分:1)

当前不可能以定义的方式(截至2019年7月)

GMock当前不支持const以外的功能说明符。原因是他们还没有找到一个好的方法。当前,他们必须在模板版本的那套单独的宏之上,为说明符的每种可能组合添加宏-constnoexcept ...所需宏的数量随着指定符的数量。

有一些拉取请求和一些解决方案,但据我所知,没有一个被接受。

您已经注意到,GMock具有一些内部功能,可以允许它使用,但是它们不是API的一部分,并且随时可能更改。只要您使用的是一个GoogleMock版本,通常就可以安全使用testing::internal,但是当您需要升级时,它可能会对您造成严重伤害

如果您仍然希望这样做,可以像下面的pull request一样准备自己的MOCK_NOEXCEPT_METHOD*“实现”

#define MOCK_NOEXCEPT_METHOD0(m, ...) GMOCK_METHOD0_(, noexcept, , m, __VA_ARGS__)
#define MOCK_NOEXCEPT_METHOD1(m, ...) GMOCK_METHOD1_(, noexcept, , m, __VA_ARGS__)
//...etc

类似地,对于MOCK_NOEXCEPT_CONST_METHOD*家庭:

#define MOCK_NOEXCEPT_CONST_METHOD0(m, ...) GMOCK_METHOD0_(, noexcept const, , m, __VA_ARGS__)
#define MOCK_NOEXCEPT_CONST_METHOD1(m, ...) GMOCK_METHOD1_(, noexcept const, , m, __VA_ARGS__)