在 CMock 中使用 ExpectWithArray 的示例

Posted

技术标签:

【中文标题】在 CMock 中使用 ExpectWithArray 的示例【英文标题】:Example for using ExpectWithArray in CMock 【发布时间】:2018-03-08 11:47:10 【问题描述】:

我在 Ubuntu 16.04 和 Eclipse 4.7.2 下使用 Ceedling。到目前为止一切正常,除了我无法使 _ExpectWithArray 模拟函数工作。

例如,我有以下函数需要模拟 void TestFunc(uint8_t * data);。在我的测试文件中,我有以下调用 uint8_t TEST_DATA[5] = 0xFF, 0x00, 0xA0, 0x00, 0x09 ; TestFunc_ExpectWithArray(TEST_DATA, 5)

我还尝试为 param_depth 提供不同的值,但没有成功。

当我尝试运行测试时,它总是失败并显示

implicit declaration of function ‘TestFunc_ExpectWithArray’ [-Wimplicit-function-declaration]

根据我的经验,当没有使用正确的参数调用要模拟的函数并且 CMock 无法生成模拟版本时,总是会发生这种情况。我究竟做错了什么?有人可以举例说明如何正确使用 _ExpectWithArray 吗?

【问题讨论】:

【参考方案1】:

为 .yml -file 中的插件添加这一行 - :array

    :cmock:
    :mock_prefix: mock_
    :when_no_prototypes: :warn
    :enforce_strict_ordering: TRUE
    :plugins:
       - :array
       - :ignore
       - :callback

示例使用 _ExpectWithArray

/test/test_example.c

    #include "unity.h"
    #include "temp.h"
    #include "mock_example.h"

    void setUp(void)
    
    

    void tearDown(void)
    
    

    void test_sendMesFirst(void)
    
        uint8_t message[] = "Hello", answerMessage[] = "Hello", answerNum = 4;
        sendBytes_ExpectWithArray(answerMessage, sizeof(message), answerNum);
        sendMes(message, sizeof(message), answerNum);
      

/src/example.h

   #ifndef example_H
   #define example_H

   #include "stdint.h"

   void sendBytes(uint8_t *bytes, int size);

   #endif //

/src/temp.c

    #include "temp.h"
    #include "example.h"


    void sendMes(uint8_t *mes, int size, int num)
    
        if(num < size)
            sendBytes(mes, num);
        else
            sendBytes(mes, size);
    

/src/temp.h

    #ifndef temp_H
    #define temp_H

    #include "stdint.h"

    void sendMes(uint8_t *mes, int size, int num);        
    #endif

【讨论】:

【参考方案2】:

作为替代方案,尝试使用_StubWithCallback 并使用自定义函数实现您自己的数组检查。

// Can be any name. Same signature as void TestFunc(uint8_t * data);
void TestFunc_CustomMock(uint8_t* array) 
  // Loop through the array and ASSERT each element
  uint8_t TEST_DATA[5] =  0xFF, 0x00, 0xA0, 0x00, 0x09 ;

  for (uint8_t i = 0; i < 5; i++) 
    TEST_ASSERT_EQUAL(TEST_DATA[i], array[i]);
  
  // Also possible to use this to check custom structs, etc. 

  // Can also return a value from this callback function, if the signature
  // says so


void test_MyFunc() 
  // Mock TestFunc(uint8_t * data)
  TestFunc_StubWithCallback((void *)&TestFunc_CustomMock);

  // Call TestFunc(uint8_t * data) which is located in MyFunc()
  MyFunc();


【讨论】:

以上是关于在 CMock 中使用 ExpectWithArray 的示例的主要内容,如果未能解决你的问题,请参考以下文章

Cmock 无法识别函数调用

如何将 CMock 单元测试框架与 Make 集成

CMock - 多个定义

如何在 cmock 中为“读取”功能配置期望

如何在 C 中模拟同一 UUT 中的函数

测试内核模块