使用Google Mock for C代码

亚历山大·吴

我正在维护一个用C编写的旧项目,要使其与C ++编译器一起运行是不可行的。由于代码是交叉编译的,因此可以在主机环境中运行单元测试或类似测试。因此,也可以与C ++主机编译器接口并使用google-test和google-mock。

google-mock的某些功能似乎很诱人,可用于调用真实的实现并设置通话期望值进行测试。

我希望能够在C代码中使用它们。我可以看到,确实可以在不使用vtables的情况下使用google-mock,但这需要模板。

有没有办法用Google Mock模拟裸露的C函数?

亚历山大·吴

我找到了一种方法来模拟google-mock中的裸C函数。

解决方案是声明foobar是映射到的弱别名foobarImpl在生产代码中,您没有实现foobar(),对于单元测试,您提供了一个调用静态模拟对象的实现。

该解决方案是特定于GCC的,但是还有其他提供弱别名的编译器/链接器。

  • 将函数重命名void foobar();void foobarImpl();
  • 向函数添加属性,foobar例如:void foobar() __attribute__((weak, alias("foobarImpl") ));
  • 如果要使用非弱别名,请使用preproessor指令从属性中删除弱。

因此:

#pragma once
void foobar();

变成

// header.h
#pragma once

void foobar();    
void foobarImpl(); // real implementation

extern "C" {
#include "header.h"
}
// code.c
void foobarImpl() {
  /* do sth */
}
void foobar() __attribute__(( weak, alias ("foobarImpl") )); // declare foobar to be a weak alias of foobarImpl

这将告诉gnu链接器在没有调用任何符号的情况下链接foobar()与的foobarImpl()调用foobar()

然后添加测试代码

struct FooInterface {
   virtual ~FooInterface() {}
   virtual void invokeFoo() const { }
};

class MockFoo : public FooInterface {
public:
  MOCK_CONST_METHOD0(invokeFoo, void());
}

struct RealFoo : public FooInterface {
   virtual ~RealFoo() {}
   virtual void invokeFoo() const { foobarImpl(); }
};

MockFoo mockFoo;
RealFoo realFoo;
void foobar() {
  mockFoo.invokeFoo();
}

如果此代码已编译并链接,它将foobar被模拟调用替换如果您确实要调用,foobar()您仍然可以添加默认调用。

ON_CALL(mockFoo, invokeFoo())
       .WillByDefault(Invoke(&realFoo,&RealFoo::invokeFoo));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法使用Google Mock C ++模拟CDatabase Open / OpenEx

来自分类Dev

使用Google Mock进行C ++高性能单元测试?

来自分类Dev

无法使用Google Mock C ++模拟CDatabase Open / OpenEx

来自分类Dev

C# Mock 使用 Moq

来自分类Dev

C ++:使用Google Mock与Code :: Blocks,MinGW和C ++ 11进行单元测试

来自分类Dev

是否可以在非托管代码中使用Mock / Fake框架?

来自分类Dev

使用Google Mock实现模拟方法

来自分类Dev

使用对象的Google Mock和SetArgPointee

来自分类Dev

使用Google Mock的无效指针错误

来自分类Dev

如何在CppUnitTestFramework中使用Google Mock

来自分类Dev

避免使用 Google Mock 调用基类

来自分类Dev

Mock module.__dict__ 使用 Python Mock

来自分类Dev

Google Mock and SetArgPointee using Objects

来自分类Dev

自动生成Google Mock方法?

来自分类Dev

从C代码使用bc

来自分类Dev

如何在终端上使用C代码运行Google测试?

来自分类Dev

C# 模拟 Mock<StreamWriter>

来自分类Dev

使用clang从C代码生成SIMD代码

来自分类Dev

使用Mock对C#中的更新方法进行单元测试

来自分类Dev

泄漏的Google Mock对象不会失败

来自分类Dev

Google Mock测试类的真实行为

来自分类Dev

Google Mock:测试对象的某些属性

来自分类Dev

在Google Mock上调用重载函数

来自分类Dev

使用extern“ C”从C ++调用C代码

来自分类Dev

在C中使用Fortran代码

来自分类常见问题

使用C ++ 11复制代码

来自分类Dev

使用ocamlbuild构建C ++代码

来自分类Dev

通过C代码使用ssh

来自分类Dev

使用PHP运行C ++代码