Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在同一类的另一个方法中调用GoogleMock方法_C++_Unit Testing - Fatal编程技术网

C++ C++;在同一类的另一个方法中调用GoogleMock方法

C++ C++;在同一类的另一个方法中调用GoogleMock方法,c++,unit-testing,C++,Unit Testing,我在这里看到了这个问题: 并试图实现答案,但对我来说不起作用 我修改了链接问题的实现,删除了mockReturnInputPlus1(),这是公认答案的建议: using ::testing::Invoke; using ::testing::_; using ::testing::Return; class MyClass { public: MyClass() : x(1) {} virtual ~MyClass() {} int ReturnInput(i

我在这里看到了这个问题:

并试图实现答案,但对我来说不起作用

我修改了链接问题的实现,删除了mock
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

如果不在MyClass中创建方法,我看不到实现对模拟行为的内部调用重定向的方法

下面是一个工作示例:

  • 删除了
    real
    成员,mock仍在继承MyClass
  • 我想“诀窍”是要知道可以像这样调用父类行为:
    mock.MyClass::ReturnInputPlus1(1)
    (),并理解这将导致使用MockMyClass::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));
}