模拟免费功能

新手上路,请多包涵

我陷入了一个问题,似乎无法找到解决方案。

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

我有一个全局函数:

 A* foo();

我有一个模拟课

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

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

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

原文由 Muhammad Hassan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 435
2 个回答

不,这是不可能的,不改变源代码,或者带上你自己的与可执行代码链接的 foo() 版本。


GoogleMock 的常见问题解答 中说

我的代码调用一个静态/全局函数。我可以嘲笑它吗?

你可以,但你需要做一些改变。

一般来说,如果您发现自己需要模拟一个静态函数,这表明您的模块耦合太紧密(并且灵活性较差、可重用性较差、可测试性较差等)。您最好定义一个小接口并通过该接口调用该函数,然后可以轻松地对其进行模拟。最初需要做一些工作,但通常会很快收回成本。

这篇 Google 测试博客 文章 说得非常好。一探究竟。

也来自 食谱

模拟自由函数

可以使用 Google Mock 来模拟自由函数(即 C 风格的函数或静态方法)。您只需要重写代码以使用接口(抽象类)。

与其直接调用自由函数(例如,OpenFile),不如为它引入一个接口并拥有一个调用自由函数的具体子类:

>  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); } };


> 您的代码应该与 FileInterface 对话以打开文件。现在很容易模拟出这个函数。
>
> 这可能看起来很麻烦,但实际上您通常可以将多个相关函数放在同一个接口中,因此每个函数的语法开销会低得多。
>
> 如果您担心虚函数引起的性能开销,并且分析证实了您的担心,您可以将其与模拟非虚方法的配方结合使用。

* * *

正如您在评论中提到的那样,您实际上提供了自己的版本 `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()); // … }

”`

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

原文由 πάντα ῥεῖ 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您的自由函数采用 std::function 对象的形式,您可以使用 MockFunction 模拟它。看到 这个答案

原文由 Rufus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题