ez8-co / emock

🐞 下一代C/C++跨平台mock库 (Next generation cross-platform mock library for C/C++)
Apache License 2.0
120 stars 35 forks source link
c cpp cppunit cross-platform gmock googlemock gtest mock mock-everything support-all-functions unittest

English README

EMOCK license Build Status Build status

正在开发

最新支持

特性矩阵

下面是和一些主流mock库的对比(如有错误,不吝指正)

平台 成员函数 普通函数 杂项
Linux Win Mac 虚函数 普通 静态 全局 变参 模板 无需修改
EMOCK :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
CppUMock :white_check_mark: :white_check_mark: :x: :white_check_mark: :x: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :x:[0]
mockcpp :white_check_mark: :white_check_mark: :x: :white_check_mark: :x: :white_check_mark: :white_check_mark: :x: :white_check_mark: :x:[1]
googlemock :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :x: :x: :x: :x: :x: :x:[2]
mockitopp :white_check_mark: :white_check_mark: :x: :white_check_mark: :x: :x: :x: :x: :x: :x:[1]
C-Mock :white_check_mark: :x: :x: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :x: :x: :x:[1]
CppFreeMock :white_check_mark: :x: :x: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :x:[1]

与使用API HOOK技术的库对比

跳转安全 this指针可见[Windows] 备注
EMOCK :white_check_mark: :white_check_mark: 使用蹦床将远跳变为短跳
mockcpp :x: :x: x64下直接使用14字节的远跳
CppFreeMock :x: :x: x64下直接使用14字节的远跳

快速概览

全局函数

      // 待测函数
      int foobar(int x) {
          return x;
      }

      // 测试时,像下面这样就可以mock
      EMOCK(foobar)
          .stubs()
          .with(any()) // 约束匹配任意输入
          .will(returnValue(1)); // 调用时返回1

      // 调用会返回1
      ASSERT_EQ(foobar(0), 1);

成员函数

      // 待测成员函数
      class Foo
      {
      public:
          void bar1(int);
          virtual void bar2(double);
          static int bar3();
      };

      ////////////////////////////////////

      // 指定调用的mock函数
      void EMOCK_API mock_bar1(Foo* obj, int) {
          // ...
      }
      void EMOCK_API mock_bar2(Foo* obj, double) {
          // ...
      }

      // 测试时,像下面这样就可以mock
      EMOCK(&Foo::bar1)
          .stubs()
          .will(invoke(mock_bar1)); // 指定调用自定义的函数而不是指定返回值
      EMOCK(&Foo::bar2) // 虚成员函数并不特别
          .stubs()
          .will(invoke(mock_bar2));
      EMOCK(Foo::bar3) // 静态函数类似全局函数,不需要&
          .stubs()
          .will(returnValue(1));

重载函数

      // 待测重载函数
      int foobar(int x) {
          return x;
      }
      double foobar(double x) {
          return x;
      }

      // 重载函数,像下面这样就可以mock
      EMOCK((int (*)(int))foobar)
          .stubs()
          .will(returnValue(1));
      EMOCK(static_cast<double (*)(double)>(foobar))
          .stubs()
          .will(returnValue(1.0));

      // 待测重载成员函数
      class Foo
      {
      public:
          void bar(int);
          void bar(double);
      };

      // 重载的成员函数,像下面这样就可以mock
      EMOCK((void (Foo::*)(int))&Foo::bar)
          .expects(once()); // 只会调用一次
      EMOCK(static_cast<void (Foo::*)(double)>(&Foo::bar))
          .expects(never()); // 不会被调用

实验功能(根据函数签名式mock)

      EMOCK("foo::bar")
          .stubs()
          .will(returnValue(1));

使用手册

衷心感谢

已知问题

写在最后

请我喝一杯咖啡

支付宝 微信 PayPal
支付宝二维码 微信二维码 PayPal二维码