本文介绍了使用GMock的命名空间的模拟方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用C ++中的GMock/Gtest编写单元测试.我无法在命名空间中模拟方法.例如:被调用函数中的 namespace :: method_name().

I am writing unit tests using GMock/Gtest in C++. I'm failing to mock a method in a namespace. For example: namespace::method_name() in the called function.

示例代码:

TestClass.cc.  // Unit test class
TEST(testFixture, testMethod) {
   MockClass mock;
   EXPECT_CALL(mock, func1(_));
   mock.helloWorld();
}
MockClass.cc  // Mock class
class MockClass{
MOCK_METHOD1(func1, bool(string));
}
HelloWorld.cc // Main class
void helloWorld() {
    string str;
    if (corona::func1(str)) { -> function to be mocked
      // Actions
    }
}

在上述 helloWorld 方法中, corona :: func1(str)无法使用上述模拟功能调用.

In the above helloWorld method, corona::func1(str) is not able to call using above mock function.

尝试的步骤:

  1. 在EXPECT CLASS中添加了名称空间声明 EXPECT_CALL(mock,corona :: func1(_)); ->编译失败.
  2. 在Mock类中添加了名称空间声明 MOCK_METHOD1(corona :: func1,bool(string)); ->编译失败
  3. 使用了模拟类和测试类中的名称空间的不同解决方法.
  1. Added namespace declaration in EXPECT CLASSEXPECT_CALL(mock, corona::func1(_)); -> failed to compile.
  2. Added namespace declaration in Mock classMOCK_METHOD1(corona::func1, bool(string)); -> failed to compile
  3. Did different workaround solutions using namespace in mock class and test class.

这时我陷入了困境,无法对 helloWorld 方法进行单元测试.实际的源代码更加复杂.我该怎么办?

I'm stuck at this point, unable to unit test the helloWorld method. The actual source code is more complex. How could I do this?

推荐答案

您不能模拟免费功能,必须创建接口:

You cannot mock free functions, you have to create interface:

struct Interface
{
    virtual ~Interface() = default;
    virtual bool func1(const std::string&) = 0;
};

struct Implementation : Interface
{
    bool func1(const std::string& s) override { corona::func1(s); }
};

void helloWorld(Interface& interface) {
    string str;
    if (interface.func1(str)) { // -> function to be mocked
      // Actions
    }
}
// Possibly, helper for production
void helloWorld()
{
    Implementation impl;
    helloWorld(impl);
}

并测试:

class MockClass : public Interface {
    MOCK_METHOD1(func1, bool(string));
};

TEST(testFixture, testMethod) {
   MockClass mock;
   EXPECT_CALL(mock, func1(_));

   helloWorld(mock);
}

这篇关于使用GMock的命名空间的模拟方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 16:50