直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分
直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分
本文是关于如何将GoogleTest和GoogleMock在没有预先编译安装在机器的情况下,直接在项目中作为项目的一部分进行编译。
目录:
- 环境依赖
- GoogleTest和GoogleMock
- 在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,结果如下图所示

直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分的更多相关文章
- 怎样在Web项目中的service业务层获取项目根路劲
这里我们有两个前提 1.没有使用struts2框架.没有使用servlet,无法给service层传递request对象. 2.使用了Spring框架. 那你可能问.会有这样的情况吗?答案是有的,比方 ...
- 在Swift项目中使用OC,在OC项目中使用Swift
几天前,我开始新的App的开发了.终于有机会把swift用在实战中了,也学到了之前纯学语法时没有机会获得的知识. 这篇博文中,我就如何使用swift.OC混编做一个介绍. OC中使用Swift 首先, ...
- IT项目中使用 json格式数据 保存项目配置信息, 在配置文件再读取json文件的内容进行赋值
json格式小巧玲珑,适合做配置文件,特别是大型项目中, 可以将配置信息分类保存到不同的json文件中, 然后再在配置文件中读取配置文件的数据进行赋值, 这里以python为例进行说明: 假设在you ...
- 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图
[Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...
- 【转】Android项目中编译 C的模块
原文网址:http://blog.csdn.net/Harrison_zhu/article/details/4057738 Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才 ...
- 在Qt项目中如何添加一个已有的项目作为子项目
新建一个子目录项目(具体方法参见<类似Visual Studio一样,使用Qt Creator管理多个项目,创建子项目>),然后需要添加的项目移动到该子目录项目目录下,再在其pro文件中添 ...
- 【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
导入项目之后,只显示项目文件,不显示项目结构 解决方法 1.点击file->project structure..->Modules 点击右上角+加号 ->import Module ...
- Maven项目中的pom.xml详解【转】
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url, ...
- hudson项目中的运用
项目中持续集成管理一直是用的hudson,最近的话,hudson遇到不少问题,因为之前对这个也不是很熟悉,所以也花了比较多的时间去解决,现在刚好也可以总结下自己学习到的hudson知识. 首先在我看来 ...
随机推荐
- 基于Ubuntu12.04-server版的openstack F版搭建步骤
本文为双节点搭建,分为计算(IP1)和控制节点(IP2) 说明: 计算节点组件: 1.mysql 2.keystone 3.Nova 4.glance 5.rabbitmq 控制节点组件: 1.cin ...
- mac 终端简单指令
pwd 当前工作目录 cd(不加参数) 进root cd(folder) 进入文件夹 cd .. 上级目录 cd ~ 返回root cd - 返回上一个访问的目录 rm 文件名 删除 cat 文件名( ...
- Mock以及Mockito的使用
mockito http://www.vogella.com/tutorials/Mockito/article.html 原文地址: http://www.open-open.com/lib/vie ...
- 一个RESTful+MySQL程序
前言 本章内容适合初学者(本人也是初学者). 上一章内容(http://www.cnblogs.com/vanezkw/p/6414392.html)是在浏览器中显示Hello World,今天我们要 ...
- [JAVA] - Java OutOfMemoryError分类
Java OutOfMemoryError一般常遇到的分为两类,分别提示: "Java heap space" 和 "PermGen space",前面的是指j ...
- C语言对齐
"%-md":左对齐,若m比实际少时,按实际输出.(m为整数) "%md":右对齐,若m比实际少时,按实际输出. 我自己编了一个,给你看看实际效果: #incl ...
- R系列:分词、去停用词、画词云(词云形状可自定义)
附注:不要问我为什么写这么快,是16年写的. R的优点:免费.界面友好(个人认为没有matlab友好,matlab在我心中就是统计软件中极简主义的代表).小(压缩包就几十M,MATLAB.R2009b ...
- c++ STL常用算法使用方法
#include <string> #include <vector> #include <functional> #include <iostream> ...
- SVN的具体使用方法介绍(安装以及操作)
今天由于项目的需要安装了SVN,在这里和大家分享一下SVN安装的详细过程和分享一些资料. (1)首先是客户端的安装. 1)获取客户端安装包. --安装包的获取路径: TortoiseSVN的官方下载地 ...
- List实现行转列的通用方案
最近在做报表统计方面的需求,涉及到行转列报表.根据以往经验使用SQL可以比较容易完成,这次决定挑战一下直接通过代码方式完成行转列.期间遇到几个问题和用到的新知识这里整理记录一下. 阅读目录 问题介绍 ...