【问题标题】:Can googlemock mock method calls from within other method calls of the same class?googlemock 可以从同一类的其他方法调用中模拟方法调用吗?
【发布时间】:2012-01-19 00:23:15
【问题描述】:

是否可以从同一类的其他方法调用中模拟方法调用?我是 C++ 新手(主要是 C 开发人员),并且对 googlemock 和 Google Test 非常陌生,所以如果在其他地方回答了这个问题并且我不明白答案,请原谅我!下面是一个简单的例子,应该解释我想要做什么。使用下面的示例,我想模拟ReturnInput,同时测试ReturnInputPlus1

using ::testing::Invoke;
using ::testing::_;
using ::testing::Return;

class MyClass
{
public:
    MyClass() : x(1) {}
    virtual ~MyClass() {}

    int ReturnInput(int x) { return x; }
    int ReturnInputPlus1(int x) { return ReturnInput(x) + 1; }
};

class MockMyClass : public MyClass
{
public:
    MockMyClass()
    {
        ON_CALL(*this, ReturnInput(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInput));
        ON_CALL(*this, ReturnInputPlus1(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInputPlus1));
    }
    virtual ~MockMyClass() {}

    MOCK_METHOD1(ReturnInput, int(int y));
    MOCK_METHOD1(ReturnInputPlus1, int(int));

private:
    MyClass real;
};

TEST(MyClassTest, mockUseClassMethod)
{
    MockMyClass mock;

    EXPECT_CALL(mock, ReturnInput(_))
        .WillOnce(Return(2));
    EXPECT_CALL(mock, ReturnInputPlus1(_))
        .Times(1);

    EXPECT_EQ(3, mock.ReturnInputPlus1(1));
}

当我运行上述测试时,我希望所有测试都能成功。相反,我得到以下输出:

1>[ RUN      ] MyClassTest.mockUseClassMethod
1>.\MyClassTest.cpp(15): error: Value of: mock.ReturnInputPlus1(1)
1>  Actual: 2
1>Expected: 3
1>.\DllInfoTest.cpp(10): error: Actual function call count doesn't match EXPECT_CALL(mock, ReturnInput(_))...
1>         Expected: to be called once
1>           Actual: never called - unsatisfied and active

【问题讨论】:

    标签: c++ unit-testing googletest googlemock


    【解决方案1】:

    您对MockMyClass::ReturnInputPlus1(1) 的调用默认在real 上调用MyClass::ReturnInputPlus1(1),它调用MyClass::ReturnInput(2)ReturnInputPlus1() 运行的对象不是mock,而是mock.real,当它调用ReturnInput() 时,它调用的是函数的原始版本。你想要做的是创建一个 MockMyClass,它有一个模拟覆盖 ReturnInput() 但根本不模拟 ReturnInputPlus1() - 你不想同时拥有你的类的模拟版本和真实版本它有时会委托给它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 2022-01-19
      相关资源
      最近更新 更多