Ale*_*lex 13
我发现了一种能够在google-mock中模拟裸C函数的方法.
解决方案是声明foobar是映射到的弱别名foobarImpl.在生产代码中,您没有实现foobar(),对于单元测试,您提供了一个调用静态模拟对象的实现.
此解决方案是GCC特定的,但还有其他编译器/链接器提供弱混叠.
void foobar();为void foobarImpl();foobar如:void foobar() __attribute__((weak, alias("foobarImpl") ));因此:
#pragma once
void foobar();
Run Code Online (Sandbox Code Playgroud)
变
// header.h
#pragma once
void foobar();
void foobarImpl(); // real implementation
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
这将告诉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();
}
Run Code Online (Sandbox Code Playgroud)
如果编译和链接此代码,它将替换foobar为模拟调用.如果你真的想打电话,foobar()你仍然可以添加默认调用.
ON_CALL(mockFoo, invokeFoo())
.WillByDefault(Invoke(&realFoo,&RealFoo::invokeFoo));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11533 次 |
| 最近记录: |