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

博客搬家,原文链接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的框架做逻辑检验。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值