消除模拟文件依赖

时间:2018-03-29 02:56:56

标签: unit-testing mocking cmock

我们正在嘲笑我们的代码,但由于模拟的头文件包括包含其他几个文件的原始头文件,因此我们很难消除模拟文件所包含的其他文件的依赖性。 我们得到的错误是:

In file included from ../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/ble_gap.h:48:0,
                from ../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/ble.h:52,
                from ../infrastructure/microcontroller_abstraction/ble/include/ble_service.h:4,
                from ../infrastructure/system_abstraction/pressure/include/pressure_service.h:15,
                from ./mocks/pressure_service_mock.h:5,
                from ./mocks/pressure_service_mock.c:7:
../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/ble_gap.h: In function 'sd_ble_gap_address_set':
../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/nrf_svc.h:66:5: error: unknown register name 'r0' in 'asm'
    __asm(                                              \
    ^

这是由于以下示例场景: 我们以示例文件压力服务mock.c为例 mock.c ----包括---> mock.h 问题是,因为mock.h是生成的,所以它包含了pressure_service.h 因为我们包含了pressure_service.h,所以它试图包含ble_service.h 然后上升包含的层次结构 原始SDK的c文件未编译 但必须包含头文件

我们如何阻止Cmock包含pressure_service.h?

请帮助我相信这是一个普遍的问题,这是为什么人们会利用CMOCK的全部目的,但我们似乎无法找到解决方案。

1 个答案:

答案 0 :(得分:0)

简答:

AFAIK没有选择让CMOCK解雇任何模拟C模块的包含。只能指定其他包含。

根据包含目录的结构,您可以尝试通过原始标头的条带化副本替换阻塞标头(示例中为pressure_service.h),这会将任何其他依赖项减少到最小值。

答案很长:

恕我直言,你这里没有遇到CMOCK的一般问题,而是你试图模拟的模块的设计问题。它是tried and tested practice,C模块的标头应该只包含此模块的 public 接口所需的其他头文件。典型的依赖关系是类型定义,用于参数和/或接口函数的返回值。由于模拟模块意味着提供指定接口的伪实现,因此CMOCK 需要将所有原始包含复制到模拟实现,以便进行编译。

通常可以解决此问题,从而减少原始标头(要模拟的标头)的依赖性,这通常会导致更好的软件体系结构。如果要模拟的模块来自第三方库,则通常无法实现。在这种情况下,解决方法是复制原始标头并将其剥离到单元测试所需的最小功能。当然这意味着,对原始界面的任何更改都需要在以后手动转移到条带化副本。如果稳定的第三方模块不应该是一个大问题。