c++ - 使用 Gmock 模拟参数化构造函数

标签 c++ constructor mocking googletest googlemock

我有类要模拟,但它没有默认构造函数。我无法更改源代码,所以有什么方法可以使用 Gmock 模拟参数化构造函数

最佳答案

是的。只需让 Mock 的构造函数使用正确的参数调用模拟类的构造函数:

class base_class {
public:
    base_class(int, int) {}

    virtual int foo(int);
};


class base_mock : public base_class {
public:
    base_mock() : base_class(23, 42) {}

    MOCK_METHOD1(foo, int(int));
};

甚至

class base_mock : public base_class {
public:
    base_mock(int a, int b) : base_class(a, b) {}

    MOCK_METHOD1(foo, int(int));
};

根据@Blackhex 的要求进行编辑

假设我们的模拟类的构造函数引用了它需要的其他类:

class helper2 {};
class helper {
public:
  helper(helper2&) {}

  /* Whatever */
};

class base2 {
public:
  base2(helper &h) {}

  virtual int foo(int);
};

与我在评论中所说的相反,不幸的是,我们确实需要处理所有的助手。然而,在这种情况下这并不太痛苦,因为我们不需要它们的任何功能。我们构建简单的空“插件”类:

struct helper2_plug: public helper2 {};
struct helper_plug : public helper {
    helper_plug() : helper(helper2_plug()) {}
};

然后,我们可以构建模拟:

class base2_mock : public base2 {
public:
    base2_mock() : base2(helper_plug()) {}

    MOCK_METHOD1(foo, int(int));
};

我在我的插件中使用了 struct 只是为了避免 public

关于c++ - 使用 Gmock 模拟参数化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17465371/

相关文章:

VB.NET设置类属性初始值

dictionary - Groovy - 在对象实例化期间忽略映射中的额外属性

unit-testing - 无法在 Groovy 测试中设置只读属性

c++ - typedef 模板类实例

c++ - GetOverlappedResult() 在运行时崩溃,但在从 VC++ 2010 进行调试时不会崩溃

c++ - 构造函数困惑

c# - c#中类参数的模拟类

android - 即使使用 Mockito 在 Android 中通过单元测试,也总是会出现线程错误

C++ vector 实现错误

C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板特化