c++ - 如何在 Visual Studio 中使用 GoogleMock?
问题描述
这将是一个自我回答的、常见问题解答式的问题。请参阅下面的答案。
使用 Visual Studio 2017/2019,设置新的Google Test 项目并开始编写测试非常容易(只要您不介意使用旧版本的 GoogleTest 版本)。
但是也使用 GoogleMock 呢?您可能会认为,自从 Google 前段时间结合了 gtest/gmock 之后,这将起作用。只是#include "gmock/gmock.h"
和嘲笑。但是不,模板自动添加的GoogleTest NuGet包根本不包含该gmock
文件夹。
尝试添加第二个 GoogleMock NuGet 包会导致多个问题,例如 gtest/gmock 版本不匹配、包含路径重叠等。
将 Microsoft GoogleTest NuGet 包替换为来自 Google的包会导致链接错误:
MSVCRTD.lib(exe_main.obj) : error LNK2019: unresolved external symbol _main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
那么在 Visual Studio 中设置 GoogleTest/GoogleMock 目前推荐的(也是最不痛苦的)方法是什么?应该能够通过测试资源管理器发现、运行和调试测试。
解决方案
我找到了两种设置方法:将整个 GoogleTest 框架直接编译到每个测试项目中,或者创建一个库项目来保存它。使用库将提供更快的构建时间,但您需要确保库和测试项目的编译/链接选项相同。
选项 1:在测试项目中直接编译 GoogleTest
- 从Google 测试模板创建一个新项目。如果需要,请在此处进行说明。
- 卸载Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static NuGet 包。
- 安装来自 Google 的最新gmock NuGet 包(当前为 v1.10.0)。
- 将文件添加
gtest_main.cc
到项目中。它应该在..\packages\gmock.1.10.0\lib\native\src\gtest\src\
此时项目应该看起来像这样(如果不是,请尝试卸载并重新加载项目):
最后的配置步骤是禁用三个 Google文件的预编译标头.cc
的使用(重要提示:也要注意空字段)。
选项 2:在静态库项目中使用 GoogleTest
- 从静态库 (C++)模板创建一个新项目。如果需要,请在此处进行说明。
- 删除所有生成的
.h
/.cpp
文件(pch.h
,pch.cpp
,framework.h
,<ProjectName>.cpp
, 等) - 安装来自 Google 的最新gmock NuGet 包(当前为 v1.10.0)。
- 禁用库项目的预编译头文件(参见上面的相关图片)。
- 从Google 测试模板创建一个新项目。如果需要,请在此处进行说明。
- 卸载Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static NuGet 包。
- 将文件添加
gtest_main.cc
到项目中。它应该在..\packages\gmock.1.10.0\lib\native\src\gtest\src\
- 禁用预编译头文件的使用
gtest_main.cc
(参见上面的相关图片)。 - 将库项目添加到测试项目的项目引用中。
- 添加
..\packages\gmock.1.10.0\lib\native\include\
到测试项目的VC++ 目录下的Include Directories
解决方案结构现在应该如下所示:
编写测试
无论哪种方式,您现在都可以开始使用 GoogleMock 编写测试了。添加#include "gmock/gmock.h"
到pch.h
文件中:
//
// pch.h
// Header for standard system include files.
//
#pragma once
#include "gtest/gtest.h"
#include "gmock/gmock.h"
打开生成的Test.cpp
文件并尝试一下。
#include "pch.h"
class MockTest {
public:
MOCK_METHOD(void, SomeMethod, ());
};
TEST(TestCaseName, TestName) {
MockTest mock;
EXPECT_CALL(mock, SomeMethod);
mock.SomeMethod();
EXPECT_EQ(1, 1);
EXPECT_TRUE(true);
}
推荐阅读
- angular - 如何在 Angular 8 中多次调用组件传单?
- c++ - 模块/videoio/cmake/detect_ffmpeg.cmake:16 处的 CMake 错误
- javascript - 如何在 Javascript 中同步计算 SHA-256?
- javascript - 在 JS 中将 JSON 处理成新格式
- node.js - Puppeteer 不断收到 TimeoutError:超过 80000 毫秒的导航超时
- javascript - 如何使用 Selenium 和 Javascript 从背景图像中检索 url
- fetch - 我的 useEffect 代码有什么问题,为什么我的状态变量为空?
- vba - SSRS 文本框属性操作选项“指定报告”表达式是否可以包含多个报告而没有?
- reactjs - useState 调用错误 Too many re-renders。React 限制渲染次数以防止无限循环
- pygame - 移动一个对象,而不必重新绘制它下面的内容。游戏