微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Googlemock 进行依赖注入和模拟的实际示例

如何解决使用 Googlemock 进行依赖注入和模拟的实际示例

我正在寻找一个简单的完整剪切和粘贴示例,用于使用 Googlemock 进行依赖注入和模拟。我发现了一些关于代码片段问题的理论讨论,这些代码片段解释了它是如何工作的,但无法找到完整的运行示例来剪切和粘贴并尝试。有什么可用的吗?

解决方法

为了了解它如何与 Googlemock 配合使用,我制作了这个完整的示例,我想与该主题的其他初学者分享。根据其他问答理论背景假设。我在 Debian Bullseye 系统上运行它。

虚构库中有一个类 Mylib,该方法只返回 123。在测试中,它被模拟为返回 456。真实类和模拟类都继承自接口类。这确保了由注入器(TEST(..){..} 宏)注入到应用程序 Myapp 的不同对象具有相同的方法调用。例子如下:

~$ cat test_myapp.cpp
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include <iostream>

class MylibInterface {
public:
    virtual ~MylibInterface() {}
    virtual int func() = 0;
};


class Mylib : public MylibInterface {
public:
    virtual ~Mylib() {}
    int func() override {
        return 123;
    }
};


class MylibMock : public MylibInterface {
public:
    virtual ~MylibMock() {}
    MOCK_METHOD(int,func,(),(override));
};


class Myapp {
    // this pointer will be injected by the injector either with pointing
    // to the real object or to the mock object. The interface ensures that both
    // objects have the same method calls.
    MylibInterface* m_mylib;

public:
    Myapp(MylibInterface* mylib) : m_mylib(mylib) {}

    bool func() {
        int ret = m_mylib->func();
        std::cout << "mylib.func returns: '" << ret << "'\n";
        return true;
    }
};


TEST(MylibTestSuite,mock_mylib_func)
// this test macro can be seen as the injector. It determins what object
// is injected to myapp.
{
    using ::testing::Return;

    // inject a real mylib object to myapp and exersize it
    Mylib mylib;
    Myapp myapp(&mylib);
    std::cout << "  real ";
    EXPECT_TRUE(myapp.func());

    // inject a mocked mylib object to myapp
    MylibMock mylib_mock;
    Myapp myapp_mock(&mylib_mock);
    EXPECT_CALL(mylib_mock,func())
        .WillOnce(Return(456));

    // and exersize it
    std::cout << "mocked ";
    EXPECT_TRUE(myapp_mock.func());
}


int main(int argc,char** argv) {
  ::testing::InitGoogleMock(&argc,argv);
  return RUN_ALL_TESTS();
}

我编译它:

~$ /usr/bin/g++ -std=c++11 -pedantic-errors -Wall -o test_myapp.a -I$BUILD_DIR/googletest-src/googletest/include -I$BUILD_DIR/googletest-src/googlemock/include test_myapp.cpp $BUILD_DIR/lib/libgtestd.a $BUILD_DIR/lib/libgmockd.a -lpthread

执行测试时,它应该如下所示:

~$ ./test_myapp.a
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from MylibTestSuite
[ RUN      ] MylibTestSuite.mock_mylib_func
  real mylib.func returns: '123'
mocked mylib.func returns: '456'
[       OK ] MylibTestSuite.mock_mylib_func (0 ms)
[----------] 1 test from MylibTestSuite (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。