我需要模拟以下功能:
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());
^
答案 0 :(得分:2)
现在,从v1.10.0开始,使用新语法就可以做到这一点。 参见change log和new syntax explanation
新语法包含一个单独的参数规范以传递限定符
class MyMock {
public:
MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...));
};
答案 1 :(得分:2)
在较旧的模拟版本上,可以通过简单的技巧来解决此类c ++装饰:
在您的示例中应该是
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
以外的功能说明符。原因是他们还没有找到一个好的方法。当前,他们必须在模板版本的那套单独的宏之上,为说明符的每种可能组合添加宏-const
,noexcept
...所需宏的数量随着指定符的数量。
有一些拉取请求和一些解决方案,但据我所知,没有一个被接受。
您已经注意到,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__)