gpt4 book ai didi

c++ - 模拟免费功能

转载 作者:可可西里 更新时间:2023-11-01 15:05:28 24 4
gpt4 key购买 nike

我遇到了一个问题,似乎找不到解决方案。

我正在使用 VS2005 SP1 编译代码。

我有一个全局函数:

A* foo();

我有一个模拟课

class MockA : public A {
public:
MOCK_METHOD0 (bar, bool());
...
};

在源代码中,它是这样访问的:foo()->bar()。我找不到一种方法来模拟这种行为。而且我无法更改来源,因此 google mock cook book 中的解决方案是毫无疑问的。

任何正确方向的帮助或指示将不胜感激。 :)

最佳答案

不,这是不可能的,如果不更改源代码,或者带来与可执行代码链接的您自己的 foo() 版本。


来自 GoogleMock's FAQ它说

My code calls a static/global function. Can I mock it?

You can, but you need to make some changes.

In general, if you find yourself needing to mock a static function, it's a sign that your modules are too tightly coupled (and less flexible, less reusable, less testable, etc). You are probably better off defining a small interface and call the function through that interface, which then can be easily mocked. It's a bit of work initially, but usually pays for itself quickly.

This Google Testing Blog post says it excellently. Check it out.

同样来自 Cookbook

Mocking Free Functions

It's possible to use Google Mock to mock a free function (i.e. a C-style function or a static method). You just need to rewrite your code to use an interface (abstract class).

Instead of calling a free function (say, OpenFile) directly, introduce an interface for it and have a concrete subclass that calls the free function:

class FileInterface {
 public:
...
virtual bool Open(const char* path, const char* mode) = 0;
};
class File : public FileInterface {
 public:
...
virtual bool Open(const char* path, const char* mode) {
return OpenFile(path, mode);
}
};

Your code should talk to FileInterface to open a file. Now it's easy to mock out the function.

This may seem much hassle, but in practice you often have multiple related functions that you can put in the same interface, so the per-function syntactic overhead will be much lower.

If you are concerned about the performance overhead incurred by virtual functions, and profiling confirms your concern, you can combine this with the recipe for mocking non-virtual methods.


正如您在评论中提到的,您实际上提供了自己的 foo() 版本,您可以使用另一个模拟类的全局实例轻松解决此问题:

struct IFoo {
virtual A* foo() = 0;
virtual ~IFoo() {}
};

struct FooMock : public IFoo {
FooMock() {}
virtual ~FooMock() {}
MOCK_METHOD0(foo, A*());
};

FooMock fooMock;

// Your foo() implementation
A* foo() {
return fooMock.foo();
}

TEST(...) {
EXPECT_CALL(fooMock,foo())
.Times(1)
.WillOnceReturn(new MockA());
// ...
}

不要忘记在每次测试用例运行后清除所有调用期望。

关于c++ - 模拟免费功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28392277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com