博客搬家,原文链接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.amock/mock_b.cpp
另外,可以结合google mock等工具,实现mock_b.cpp,这样一方面可以节约花费在mock上的时间,另外一方面还可以方便的利用google mock的框架做逻辑检验。