java打桩_C代码的打桩框架 - FFF (Fake Function Framework)
我只是IT圈的搬运工,项目原址外链网址已屏蔽
FFF是一个用宏实现的小框架,只需要一个头文件fff.h,没有任何其他依赖,非常简洁。
FFF的核心就是三个宏:
FAKE_VOID_FUNC(fn [,arg_types*]);
定义一个名为fn的桩函数,返回值为空,有n个参数。
FAKE_VALUE_FUNC(return_type, fn [,arg_types*]);
定义一个名为fn的桩函数,返回值类型为return_type,有n个参数。
RESET_FAKE(fn);
重置桩函数fn的调用信息。
实现上,FFF为桩生成了一系列变量。以带有返回值并且有一个参数的桩函数为例:
#define DECLARE_FAKE_VALUE_FUNC1(RETURN_TYPE, FUNCNAME, ARG0_TYPE) \
EXTERN_C \
typedef struct FUNCNAME##_Fake { \
DECLARE_ARG(ARG0_TYPE, 0, FUNCNAME) \
DECLARE_ALL_FUNC_COMMON \
DECLARE_VALUE_FUNCTION_VARIABLES(RETURN_TYPE) \
RETURN_TYPE(*custom_fake)(ARG0_TYPE arg0); \
} FUNCNAME##_Fake;\
extern FUNCNAME##_Fake FUNCNAME##_fake;\
void FUNCNAME##_reset(); \
END_EXTERN_C \
DECLARE_ARG生成了存储当前参数值的变量和存储历史参数值的数组。
#define DECLARE_ARG(type, n, FUNCNAME) \
type arg##n##_val; \
type arg##n##_history[FFF_ARG_HISTORY_LEN];
DECLARE_ALL_FUNC_COMMON定义了桩被调用的次数,参数历史数组的长度以及调用HISTORY_DROPPED的次数。
#define DECLARE_ALL_FUNC_COMMON \
unsigned int call_count; \
unsigned int arg_history_len;\
unsigned int arg_histories_dropped; \
DECLARE_VALUE_FUNCTION_VARIABLES定义了桩函数返回值相关的数据。
custom_fake提供了一个回调接口,可以用自己的函数来构造返回值。
实例:
#include "UI.h"
#include "../../fff.h"
#include "SYSTEM.h"
#include "DISPLAY.h"
#include
#include
#include
/* Test Framework :-) */
void setup();
#define TEST_F(SUITE, NAME) void NAME()
#define RUN_TEST(SUITE, TESTNAME) printf(" Running %s.%s: \n", #SUITE, #TESTNAME); setup(); TESTNAME(); printf(" SUCCESS\n");
DEFINE_FFF_GLOBALS;
/* SYSTEM.h */
FAKE_VOID_FUNC2(SYSTEM_register_irq, irq_func_t, unsigned int);
/* DISPLAY.h */
FAKE_VOID_FUNC(DISPLAY_init);
FAKE_VOID_FUNC(DISPLAY_clear);
FAKE_VOID_FUNC(DISPLAY_output, char *);
FAKE_VALUE_FUNC(unsigned int, DISPLAY_get_line_capacity);
FAKE_VALUE_FUNC(unsigned int, DISPLAY_get_line_insert_index);
FAKE_VOID_FUNC0(button_press_cbk);
/* Initialializers called for every test */
void setup()
{
RESET_FAKE(SYSTEM_register_irq);
RESET_FAKE(DISPLAY_init)
RESET_FAKE(DISPLAY_clear)
RESET_FAKE(DISPLAY_output)
RESET_FAKE(DISPLAY_get_line_capacity)
RESET_FAKE(DISPLAY_get_line_insert_index);
RESET_FAKE(button_press_cbk);
FFF_RESET_HISTORY();
DISPLAY_get_line_capacity_fake.return_val = 2;
}
/* Tests go here */
TEST_F(UITests, init_will_initialise_display)
{
UI_init();
assert(DISPLAY_init_fake.call_count == 1);
}
TEST_F(UITests, init_will_register_interrupt_gpio2)
{
UI_init();
assert(SYSTEM_register_irq_fake.call_count == 1);
assert(SYSTEM_register_irq_fake.arg0_val == UI_button_irq_handler);
assert(SYSTEM_register_irq_fake.arg1_val == IRQ_GPIO_2);
}
TEST_F(UITests, when_no_irq_then_missed_irq_counter_zero)
{
assert(UI_get_missed_irqs() == 0);
}
TEST_F(UITests, when_one_irq_and_no_handler_then_missed_irq_counter_one)
{
UI_button_irq_handler();
assert(UI_get_missed_irqs() == 1);
}
TEST_F(UITests, when_one_irq_and_valid_callback_then_missed_irq_counter_zero)
{
UI_init();
UI_register_button_cbk(button_press_cbk);
UI_button_irq_handler();
assert(UI_get_missed_irqs() == 0);
}
TEST_F(UITests, when_one_irq_and_valid_callback_then_callback_called)
{
UI_register_button_cbk(button_press_cbk);
UI_button_irq_handler();
assert(button_press_cbk_fake.call_count == 1);
}
TEST_F(UITests, write_line_outputs_lines_to_display)
{
char msg[] = "helloworld";
UI_write_line(msg);
assert(DISPLAY_output_fake.call_count == 1);
assert(strncmp(DISPLAY_output_fake.arg0_val, msg, 26) == 0);
}
TEST_F(UITests, when_no_empty_lines_write_line_clears_screen_and_outputs_lines_to_display)
{
DISPLAY_get_line_insert_index_fake.return_val = 2;
char msg[] = "helloworld";
UI_write_line(msg);
assert(DISPLAY_clear_fake.call_count == 1);
assert(DISPLAY_output_fake.call_count == 1);
// Check the order of the calls: Don't care about the first two:
// DISPLAY_get_line_capacity and DISPLAY_get_line_insert_index
assert(fff.call_history_idx == 4);
assert(fff.call_history[2] == (void *) DISPLAY_clear);
assert(fff.call_history[3] == (void *) DISPLAY_output);
}
TEST_F(UITests, when_empty_lines_write_line_doesnt_clear_screen)
{
// given
DISPLAY_get_line_insert_index_fake.return_val = 1;
char msg[] = "helloworld";
// when
UI_write_line(msg);
// then
assert(DISPLAY_clear_fake.call_count == 0);
}
TEST_F(UITests, when_string_longer_than_26_then_truncated_string_output)
{
// given
char input[] = "abcdefghijklmnopqrstuvwxyz0123456789";
char expected[] = "abcdefghijklmnopqrstuvwxyz";
// when
UI_write_line(input);
// then
assert(strncmp(expected, DISPLAY_output_fake.arg0_val, 37) == 0);
}
TEST_F(UITests, when_outputting_to_full_display_then_previous_inserted)
{
// given
DISPLAY_get_line_insert_index_fake.return_val = 1;
char oldest[] = "oldest";
char newest[] = "newest";
// when
UI_write_line(oldest);
UI_write_line(newest);
// then
assert(DISPLAY_output_fake.call_count == 2);
// fills last line
assert(strncmp(oldest, DISPLAY_output_fake.arg0_history[0], 37) == 0);
//clears
assert(DISPLAY_clear_fake.call_count == 1);
// inserts old line at first
assert(strncmp(oldest, DISPLAY_output_fake.arg0_history[1], 37) == 0);
// then inserts new line
assert(strncmp(newest, DISPLAY_output_fake.arg0_history[2], 37) == 0);
}
int main()
{
setbuf(stdout, NULL);
fprintf(stdout, "-------------\n");
fprintf(stdout, "Running Tests\n");
fprintf(stdout, "-------------\n\n");
fflush(0);
/* Run tests */
RUN_TEST(UITests, init_will_initialise_display);
RUN_TEST(UITests, init_will_register_interrupt_gpio2);
RUN_TEST(UITests, when_no_irq_then_missed_irq_counter_zero);
RUN_TEST(UITests, when_one_irq_and_no_handler_then_missed_irq_counter_one);
RUN_TEST(UITests, when_one_irq_and_valid_callback_then_missed_irq_counter_zero);
RUN_TEST(UITests, when_one_irq_and_valid_callback_then_callback_called);
RUN_TEST(UITests, write_line_outputs_lines_to_display);
RUN_TEST(UITests, when_no_empty_lines_write_line_clears_screen_and_outputs_lines_to_display);
RUN_TEST(UITests, when_empty_lines_write_line_doesnt_clear_screen);
RUN_TEST(UITests, when_string_longer_than_26_then_truncated_string_output);
printf("\n-------------\n");
printf("Complete\n");
printf("-------------\n\n");
return 0;
}
java打桩_C代码的打桩框架 - FFF (Fake Function Framework)相关推荐
- 算法集训队第二场考核赛_C.掌门人打桩
原题链接:算法集训队第二场考核赛_C.掌门人打桩 C.掌门人打桩 题目背景 传说在艾泽拉斯的潘达利亚,影踪派的掌门人祝踏岚擅于打桩,有着影踪派自家的一套绝学. 题目描述 来自暴风城远征队的你拜影踪派掌 ...
- Java单元测试进阶之如何打桩(用easymock轻松打桩)
打桩(mock)是单元测试的重要内容和难点,学好打桩的技术,做单元测试基本就没什么困难了. mock有两种,一种是静态的,一种是动态的.静态的就是在写测试代码之前根据需要打桩的类生成另外一个类,这个类 ...
- 字节码插桩(javassist)之插入代码块|IOC框架(Hilt)之对象注入~研究
Hilt对象注入 | javassist插桩 研究 Hilt对象注入 javassist字节码插桩 创建buildSrc的module 重写Transform 熟悉TransformInvocatio ...
- c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法
c# typescript by Leonardo Carreiro 莱昂纳多·卡雷罗(Leonardo Carreiro) 在任何IDE中从C#,Java或Python代码获取TypeScript接 ...
- Java 程序员如何使用 Shiro 框架
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:冷豪 来自:www.cnblogs.com/learnhow ...
- java 用程序代码解释继承_关于初级java程序员笔试题
关于初级java程序员笔试题 Sun 认证Java程序员考试内容涉及Java所有相关知识.编程概念及applet开发技巧.下面是小编整理的关于初级java程序员笔试题,欢迎大家参考! 第一题:判断题 ...
- 使用JNA,让java调用原生代码
JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...
- java实现三级联动查询_Java框架SSH结合Easyui控件实现省市县三级联动示例解析
Easyui调用数据库实现省市县区三级联动的效果如果下 1.首先要设计数据库,如图所示.一个有4个字段code,note,pycode.code:行政区划代码,note:中文注释,pycode:拼音缩 ...
- c mysql封装 jdbc_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现
最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...
最新文章
- 对话框属性页(VC_MFC)
- jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常
- iOS深入探索直播推拉流实现流程(二:推流权限判断 )
- 一致性代码段和非一致性代码段
- centos7搭建apache服务器(亲测可用)
- python arcgis批量绘图_ARCGIS中Python实现批量裁剪
- windows 打印机 print spooler 无法启动 错误1068 的问题
- python subprocess.Popen简明总结
- Eclipse之Android开发环境搭建
- js 设置焦点 判断控件是否获得焦点 判断哪个控件获得焦点
- 统计自然语言处理——信息论基础
- 纪广华老师:谈谈学习数论的参考书
- MIDAS:混频数据回归
- 态密度的Delta函数公式以及范霍夫奇点
- Android 仿淘宝京东等我的订单界面及任意列表拓展
- win7无法打开计算机共享文件夹,Win7共享文件夹无法访问怎么办?Win7共享文件夹无法访问解决方法...
- 游戏音乐怎样达到阴阳平衡?
- 【二】分布式训练---参数服务器训练(飞桨paddle1.8)
- iOS开发系列–打造自己的“美图秀秀”(上)
- 实战PyQt5: 050-选项卡控件QTabWidget
热门文章
- 2020年度中国IDC产业第三方数据中心排行
- 每日新闻摘要:MS Office漏洞现在占攻击的70%
- 命令行中怎样用FTP命令下载一个目录(已解决)
- python 列表 元祖 字典 集合_python基础知识之列表、元祖、字典、集合、字符串。...
- python调用linuxapi_Linux上使用python调用WPS二次开发接口
- html5小游戏源码-扫雷
- 第五课 竞争神经网络和SO(F)M神经网络——无监督神经网络模型
- JDL-1220A电流继电器
- 软件工程导论05-结构化分析与设计
- 快速构建pyqt5界面UI