如何在 Visual Studio 中使用 GoogleMock?

Chr*_*sen 13 c++ googletest visual-studio googlemock

这将是一个自我回答的常见问题解答式问题。请参阅下面的答案。

使用 Visual Studio 2017/2019 设置新的Google Test 项目并开始编写测试非常容易(只要您不介意使用旧版本的 GoogleTest 版本)。

但是如何使用 GoogleMock 呢?你会认为自从谷歌前一段时间合并了 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)
Run Code Online (Sandbox Code Playgroud)

那么目前在 Visual Studio 中设置 GoogleTest/GoogleMock 的推荐(也是最不痛苦的)方式是什么?应该能够通过测试资源管理器发现、运行和调试测试。

Chr*_*sen 10

我找到了两种设置方法:将整个 GoogleTest 框架直接编译到每个测试项目中,或者创建一个库项目来保存它。使用库将缩短构建时间,但您需要确保库和测试项目上的编译/链接选项相同。

选项 1:在测试项目中直接编译 GoogleTest


  1. Google 测试模板创建一个新项目。如果需要,请在此处提供说明。
  2. 卸载Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static NuGet 包。
  3. 安装来自 Google的最新gmock NuGet 包(当前为 v1.10.0)。
  4. 将文件添加gtest_main.cc到项目中。它应该在..\packages\gmock.1.10.0\lib\native\src\gtest\src\

此时项目应该看起来像这样(如果不是,请尝试卸载重新加载项目):

解决方案资源管理器视图

最后的配置步骤是禁用三个 Google文件的预编译头.cc文件(重要:也请注意空字段)。

在此处输入图片说明

选项 2:在静态库项目中使用 GoogleTest


  1. 静态库 (C++)模板创建一个新项目。如果需要,请在此处提供说明。
  2. 删除所有生成.h/.cpp文件(pch.hpch.cppframework.h<ProjectName>.cpp,等)
  3. 安装来自 Google的最新gmock NuGet 包(当前为 v1.10.0)。
  4. 禁用库项目的预编译头文件(见上面的相关图片)。
  5. Google 测试模板创建一个新项目。如果需要,请在此处提供说明。
  6. 卸载Microsoft.googletest.v140.windesktop.msvcstl.static.rt-static NuGet 包。
  7. 将文件添加gtest_main.cc到项目中。它应该在..\packages\gmock.1.10.0\lib\native\src\gtest\src\
  8. 禁用预编译头文件gtest_main.cc(见上面的相关图片)。
  9. 将库项目添加到测试项目的项目引用。
  10. VC++目录下添加..\packages\gmock.1.10.0\lib\native\include\到测试项目的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"
Run Code Online (Sandbox Code Playgroud)

打开生成的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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您在编译 gmock 时看到数百个错误,需要注意一件事:似乎在 vcxproj 文件的 `&lt;ImportGroup Label="ExtensionTargets"&gt;` 部分中,googletest 导入行位于 gmock 之前至关重要。删除和添加 NuGet 包时,这些可能会出现混乱。要解决此问题,只需在文本编辑器中加载 vcxproj 并交换行即可。 (2认同)