【问题标题】:C++ GoogleMock mock method call within another method of the same class同一类的另一个方法中的 C++ GoogleMock 模拟方法调用
【发布时间】:2018-02-08 23:06:43
【问题描述】:

我在这里查看了这个问题: Can googlemock mock method calls from within other method calls of the same class?

并尝试实施答案,但它对我不起作用。

我已经修改了链接问题实现以删除模拟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; }
  private:
    int x;
};

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

    MOCK_METHOD1(ReturnInput, int(int y));

private:
    MyClass real;
};

TEST(MyClassTest, mockUseClassMethod)
{
    MockMyClass mock;

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

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

这仍然返回相同的失败

/projects/tests/cpp/google-test/test.cpp:46: Failure
      Expected: 3
To be equal to: mock.ReturnInputPlus1(1)
      Which is: 2
/projects/tests/cpp/google-test/test.cpp:41: Failure
Actual function call count doesn't match EXPECT_CALL(mock, ReturnInput(_))...
         Expected: to be called once
           Actual: never called - unsatisfied and active

【问题讨论】:

    标签: c++ unit-testing


    【解决方案1】:

    如果不使用 MyClass virtual 中的方法,我看不到将内部调用重定向到模拟行为的方法。

    下面是一个工作示例:

    • 删除了 real 成员,模拟仍然继承 MyClass
    • 我想“诀窍”是要知道可以像这样调用父类行为:mock.MyClass::ReturnInputPlus1(1) (qualified name lookup) 并了解 dynamic dispatch 将导致使用 M​​ockMyClass::ReturnInput。
    • 我不太确定 MyClass::x 想要实现什么,因为它会被函数参数所掩盖。

    class MyClass
    {
    public:
        MyClass()
            : m_x(1)
        {
        }
        virtual ~MyClass() {}
    
        virtual int ReturnInput(int x) { return x; }
        virtual int ReturnInputPlus1(int x) { return ReturnInput(x) + 1; }
    
    private:
        int m_x;
    };
    
    class MockMyClass : public MyClass
    {
    public:
        MockMyClass()
            : MyClass()
        {
            ON_CALL(*this, ReturnInput(_)).WillByDefault(Invoke(this, &MyClass::ReturnInput));
        }
        virtual ~MockMyClass() {}
    
        MOCK_METHOD1(ReturnInput, int(int y));
        MOCK_METHOD1(ReturnInputPlus1, int(int y));
    };
    
    TEST(MyClassTest, mockUseClassMethod)
    {
        MockMyClass mock;
    
        EXPECT_CALL(mock, ReturnInput(_)).WillOnce(Return(2));
    
        EXPECT_EQ(3, mock.MyClass::ReturnInputPlus1(1));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多