我正试图用gMock为ROS(动力学(单元测试模拟一个特定的类。我可以使用gTest让单元测试按原样运行,但在尝试模拟函数时,我在VSCode中遇到了错误。
在我的测试文件中,
#include <gmock/gmock.h>
class Handlers
{
public:
virtual bool onShutdown(void) { return true; };
virtual bool onHardRestart(void) { return true; };
virtual bool onSoftRestart(void) { return true; };
virtual ~Handlers(){};
};
class MockHandlers : public Handlers
{
public:
MOCK_METHOD(bool, onShutdown, (void), (override));
MOCK_METHOD(bool, onHardRestart, (void), (override));
MOCK_METHOD(bool, onSoftRestart, (void), (override));
};
但对MOCK_METHOD
的引用下面有红色的歪歪扭扭。
int MockHandlers::MOCK_METHOD(bool, <error-type>, <error-type>, <error-type>)
explicit type is missing ('int' assumed)
我假设这是因为宏被解释为函数声明,因为找不到MOCK_METHOD。然而,我可以控制+点击#include <gmock/gmock.h>
行,没有任何问题,这似乎意味着include路径在某种程度上被配置了?
使用以下c_cpp_properties.json
在VSCode中的Ubuntu 16.04上运行。
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/home/alexytsu/Develop/catkin_ws/devel/include/**",
"/opt/ros/kinetic/include/**",
... ${omitted my user-specific catkin_ws folders}
"/usr/include/**"
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/clang",
"cStandard": "c11"
}
],
"version": 4
}
gmock lib安装在哪里?你确定你在用gmock 1.10吗?在以前的版本中,没有MOCK_METHOD
宏,而是一个独立的宏,这取决于模拟函数签名的数量(确切地说是参数和cv类型限定符的数量(,即在您需要使用MOCK_METHOD0
的情况下,请尝试以下操作:
class MockHandlers : public Handlers
{
public:
MOCK_METHOD0(onShutdown ,bool());
MOCK_METHOD0(onHardRestart ,bool());
MOCK_METHOD0(onSoftRestart ,bool());
};
AFAIK Ubuntu 16.04和18.04在APT回购中没有1.10
,但我可能错了。
我也遇到了这个问题。我们的代码使用了gtest
和gmock
的特定版本,并且我们的构建是在Docker映像中完成的,该映像仅包含我们存储库中的第三方库的版本;然而,我用来编辑的机器也安装了cmake-extras
,其中包括gtest
和gmock
。这些版本安装在/usr/include/gtest
和/usr/include/gmock
中,并且在所需版本之前由VSCode找到。
解决方案是在.vscode/c_cpp_properties.json
配置的includePath
中的${default}
之前放置所需版本的链接,以便VSCode在默认包含路径中的任何版本之前找到它们:
{
"configurations": [
{
...
"includePath": [
"${workspaceFolder}/refpack/common/3rdparty/googletest/googlemock/include",
"${workspaceFolder}/refpack/common/3rdparty/googletest/googletest/include",
"${default}"
],
...
}
],
...
}
[我们需要${default}
条目来获取我的机器和Docker映像中常见的标准Linux标头。如果告诉VSCode忽略/usr/include
中的某些路径,那会很好,但我想不出办法。排除文件夹的选项似乎只适用于文件夹/文件搜索,而不适用于Intellisense。]