直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分

时间:2023-03-08 17:42:17

直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分

本文是关于如何将GoogleTest和GoogleMock在没有预先编译安装在机器的情况下,直接在项目中作为项目的一部分进行编译。

目录:

  1. 环境依赖
  2. GoogleTest和GoogleMock
  3. 在CMake项目中配置GoogleTest和GoogleMock

1. 环境依赖

Note: 环境只列出了本文实现过程中本人机器的配置,不代表最低配置

  • ubuntu 14.04 64位
  • CMake 2.8

2.GoogleTest和GoogleMock

Google Test是谷歌开源的C++ 单元测试框架,简称gtest。Google Mock是Google Test的一个扩展,是为了应用c++的模拟类。

3.在CMake项目中配置GoogleTest和GoogleMock

如果GoogleTest和GoogleMock已经实现安装到机器上了,在CMake项目中使用GoogleTest和GoogleMock非常方便,只需要使用find_package()就可以使用它们,点击查看详情。但是如果不像在机器中安装GoogleTest和GoogleMock并且希望项目在其他机器上也能够正常的运行而不需要安装GoogleTest和GoogleMock,那么使用find_package()这种方法就无能为力了。本文的前提是没有安装GoogleTest和GoogleMock且希望将GoogleTest和GoogleMock作为项目的一部分直接build到项目中。

为了达到这个目的,可以借用Crascit在github上提供的包下载模块 中的DownloadProject.cmake和DownloadProject.CMakeLists.cmake.in文件,并且将其放在项目的顶层目录中。并且在CMakeLists.txt文件中加入如下部分。

cmake_minimum_required(VERSION 2.8.2)

project(CPP_CMake_GoogleTest)

include(CTest)

if (CMAKE_VERSION VERSION_LESS 3.2)
set(UPDATE_DISCONNECTED_IF_AVAILABLE "")
else()
set(UPDATE_DISCONNECTED_IF_AVAILABLE "UPDATE_DISCONNECTED 1")
endif() include(DownloadProject.cmake)
download_project(PROJ googletest
PREFIX CMAKE_SOURCE_DIR/third_parts/googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG master
${UPDATE_DISCONNECTED_IF_AVAILABLE}
) # Prevent GoogleTest from overriding our compiler/linker options
# when building with Visual Studio
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) # When using CMake 2.8.11 or later, header path dependencies
# are automatically added to the gtest and gmock targets.
# For earlier CMake versions, we have to explicitly add the
# required directories to the header search path ourselves.
if (CMAKE_VERSION VERSION_LESS 2.8.11)
include_directories("${gtest_SOURCE_DIR}/include"
"${gmock_SOURCE_DIR}/include")
endif() # Trivial example using gtest and gmock
add_executable(example example.cpp)
target_link_libraries(example gtest gmock_main)
add_test(NAME example_test COMMAND example)

download_project函数默认使用的是CMAKE_BINARY_DIR作为下载包和安装包的位置,读者可以通过PREFIX参数设置oogleTest和GoogleMock的位置。本人喜欢将第三方库放在ProjectName/third_parts/package_name,故将PREFIX参数设置成CMAKE_SOURCE_DIR/third_parts/googletest。

编写example进行测试,example.cpp代码如下:

#include "gtest/gtest.h"
#include "gmock/gmock.h" // Simple test, does not use gmock
TEST(Dummy, foobar)
{
EXPECT_EQ(1, 1);
} // Real class we want to mock
class TeaBreak
{
public:
virtual ~TeaBreak() {} // Return minutes taken to make the drinks
int morningTea()
{
return makeCoffee(true, 1) +
makeCoffee(false, 0.5) +
makeHerbalTea();
} private:
virtual int makeCoffee(bool milk, double sugars) = 0;
virtual int makeHerbalTea() = 0;
}; // Mock class
class MockTeaBreak : public TeaBreak
{
public:
MOCK_METHOD2(makeCoffee, int(bool milk, double sugars));
MOCK_METHOD0(makeHerbalTea, int());
}; using ::testing::Return;
using ::testing::_; // Mocked test
TEST(TeaBreakTest, MorningTea)
{
MockTeaBreak teaBreak;
EXPECT_CALL(teaBreak, makeCoffee(_,_))
.WillOnce(Return(2))
.WillOnce(Return(1));
EXPECT_CALL(teaBreak, makeHerbalTea())
.WillOnce(Return(3)); EXPECT_LE(teaBreak.morningTea(), 6);
}

本文中项目结果如下图所示:

直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分

进行编译:

mkdir build
cd build
cmake ..
make

运行example,结果如下图所示

直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分