Может ли googlemock имитировать вызовы методов из вызовов других методов того же класса? - PullRequest
2 голосов
/ 19 января 2012

Можно ли смоделировать вызовы методов из других вызовов метода того же класса? Я новичок в 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

1 Ответ

3 голосов
/ 21 января 2012

Ваш звонок на MockMyClass::ReturnInputPlus1(1) вызывает MyClass::ReturnInputPlus1(1) на real по умолчанию, что вызывает MyClass::ReturnInput(2). Объект, на котором работает ReturnInputPlus1(), это не mock, а mock.real, и когда он вызывает ReturnInput(), он вызывает исходную версию функции. То, что вы хотите сделать, - это создать MockMyClass, который имеет переопределение макета ReturnInput(), но вообще не макетирует ReturnInputPlus1() - вы не хотите иметь как макетную версию вашего класса, так и реальную версию, которая иногда делегирует.

...