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

直接在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);
}

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

项目代码结构图

进行编译:

mkdir build
cd build
cmake ..
make

运行example,结果如下图所示

example gtest 结果

posted @ 2017-03-28 15:38  昵称不重要看备注  阅读(4242)  评论(0)    收藏  举报