首页 > 解决方案 > 如何在 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 目前推荐的(也是最不痛苦的)方法是什么?应该能够通过测试资源管理器发现、运行和调试测试。

标签: c++visual-studiogoogletestgooglemock

解决方案


我找到了两种设置方法:将整个 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.h, pch.cpp, framework.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. 添加..\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);
}

推荐阅读