我正在维护一个用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") ));
因此:
#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] 删除。
我来说两句