您的位置:首页 > 编程语言 > C语言/C++

C++单元测试中Mock外部依赖的方法

2014-07-07 21:35 211 查看
博客搬家,原文链接C++单元测试中Mock外部依赖的方法

本文只涉及在Makefile编译环境下在UT中Mock外部编译依赖的方法。

背景

假设现在有一个模块A,目录结构如下:
A/Makeifle
A/include/a.h
A/src/a.cpp


Makefile依赖了另外一半模块B,目录与A同级,目录架构如下:
B/include/b.h
B/lib/libb.a


这里B作为A的外部依赖模块而存在,A在Makefile中包含了B的头文件路径,并链接了libb.a

A模块的Makefile如下,
CXX=g++
INCPATH=-I../B/include -Iinclude
a.o
$(CXX) -c $(INCPATH) -o main src/a.cpp ../B/lib/libb.a


B模块包含网络交互、系统调用等等一些负责的操作,这些函数和类在a.cpp中被使用到。

问题

这个时候需要为A模块做单元测试,怎么办?

解决方法

因为不能将真正的B模块链接进来,否则A的UT代码将严重依赖外部环境甚至没法执行,因此可以通过在A模块的测试代码中编写Mock的方式来替代B中定义的类和函数等,并在UT代码的Makefile中完全替换头文件路径和链接库路径来达到目的。

在A下新建test目录用于专门存放UT代码
A/test/Makefle
A/test/test_a.cpp


这时候为了让UT中A/src/a.cpp在不引用B模块的情况下照样能编译通过,需要在test目录下生成一个假的同名文件b.h,并在其中声明一样的类,函数等:
A/test/mock/b.h
A/test/mock/mock_b.cpp


最后可以按照自己的需要在mock/mock_b.cpp中定义的mock/b.h中声明的和方法,并最终编译链接到UT的binary中去。

test目录下的Makefile如下
CXX=g++
INCPATH=-I../B/include -I../include —Imock
a.o
$(CXX) -c $(INCPATH) -o main ../src/a.cpp ../B/lib/libb.a mock/mock_b.cpp


另外,可以结合google mock等工具,实现mock_b.cpp,这样一方面可以节约花费在mock上的时间,另外一方面还可以方便的利用google mock的框架做逻辑检验。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: