【问题标题】:NiceMock a Mock that has another Mock as a constructor parameterNiceMock 具有另一个 Mock 作为构造函数参数的 Mock
【发布时间】:2017-09-08 20:35:10
【问题描述】:

我想将 Mock 与 NiceMock 一起使用。 Mock 有一个构造函数,它接受另一个 Mock 作为参数。这是我拥有的代码的一个小例子

class ClassA
{
    ClassA() { }
};

template <class T>
class ClassB>
{
    ClassB(ClassA & a) { } // constructor, no default constructor for this class
};

class ClassC
{
    ClassC() { }
};

class MyTest : public Test
{
    MockClassA a;
    MockClassB<ClassC> * b = NULL;

    SetUp()
    {
        b = new MockClassB<ClassC>(a);
    }
    ...
};

这很好,但如果我尝试将 MockClassB 与这样的 NiceMock 一起使用

MockClassA a;
NiceMock<MockClassB<ClassC>> * b = NULL;

SetUp()
{
    b = new NiceMock<MockClassB<ClassC>>(a);
}

我收到一个编译错误,提示 cannot convert argument 1 from 'const MockClassA' to 'ClassA &amp;'。请注意,错误出现在 ClassA 上,它是 ClassB 的构造函数的参数类型。将 ClassA 包装在像 NiceMock&lt;MockClassA&gt; a 这样的 NiceMock 中并没有帮助,我只是得到一个类似的错误:cannot convert argument 1 from 'const testing::NiceMock&lt;MockClassA&gt;' to 'ClassA &amp;'

我有其他与 NiceMock 一起使用的模板类,但它们没有任何构造函数参数。

有什么想法吗?

【问题讨论】:

  • 我也面临的问题是构造函数的参数是非常量引用。我建议更新标题以表明问题是非常量引用参数。这将帮助搜索此问题的人更轻松地找到有用的答案。感谢您提出这个问题。

标签: c++ unit-testing googletest gmock


【解决方案1】:

ClassB 构造函数中的参数是对ClassA 的非常量引用,在NiceMock 中是不允许的。根据documentation,限制之一是:

基础模拟 (MockFoo) 的构造函数不能通过非常量引用传递参数

要使其工作,请改为传递 const 引用

ClassB(const ClassA & a) { }

或者传递一个指向ClassA的指针

ClassB(ClassA * a) { }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2015-09-22
    相关资源
    最近更新 更多