Google Test WillOnce(Return()) манипулирует ожидаемым возвращаемым значением

В настоящее время я пытаюсь проверить возможности google test в C++. (Чтобы быть более конкретным: гугл макет)

Теперь я столкнулся с проблемой. Это должно быть очень легко, это работало раньше, но каким-то образом это испортилось, и фреймворк не работает, как ожидалось. Хватит говорить, вот моя проблема.

Я пытаюсь сделать простую вещь, чтобы увидеть, если функция "DoSomeMathTurtle" вызывается один раз и возвращает ожидаемое значение. Но ".WillOnce(Return(x))" манипулирует ожидаемым значением, которое всегда истинно.

class Turtle {
    ...
    virtual int DoSomeMathTurtle(int , int); //Adds two ints together and returns them
    ...
};

Мой насмешливый класс:

    class MockTurtle : public Turtle{
    public:
        MockTurtle(){
            ON_CALL(*this, DoSomeMathTurtle(_, _))
                .WillByDefault(Invoke(&real_, Turtle::DoSomeMathTurtle)); 
            //I did this so the function gets redirected to a real
            // object so those two numbers actually get added together 
            //(without that it returns always 0)

        }
        MOCK_METHOD2(DoSomeMathTurtle, int(int, int));
    private:
        Turtle real_;
    };

Базовый класс тестирования:

class TestTurtle : public ::testing::Test{
protected:
    //De- & Constructor
    TestTurtle(){}
    virtual ~TestTurtle(){} //Has to be virtual or all tests will fail

    //Code executed before and after every test
    virtual void SetUp(){}
    virtual void TearDown(){}

    //Test Fixtures which can be used in each test
    MockTurtle m_turtle;
 };

Мой тестовый случай:

    TEST_F(TestTurtle, MathTest){
            int x = 2; // Expected value
            int rvalue; // Returned value of the function

            EXPECT_CALL(m_turtle, DoSomeMathTurtle(_, _))
                .Times(1)
                .WillOnce(Return(x));

                rvalue = m_turtle.DoSomeMathTurtle(3,3); // rvalue should be 6 but it is 2
                cout << "[          ] Expected value: " << x << " Returned value " << rvalue << endl;
                //This prints: [          ] Expected value 2 Returned value 2
                //Then the test passes !?
            }
        }

Когда я комментирую "WillOnce(Return(x))" out, rvalue становится 6 (значение, которым он должен стать). когда "WillOnce(Return(x))" &

ON_CALL(*this, DoSomeMathTurtle(_, _))
                .WillByDefault(Invoke(&real_, Turtle::DoSomeMathTurtle)); 

(в конструкторе моего mock-класса) закомментировано, rvalue становится 0 (что также должно происходить).

Так что, как только "WillOnce(Return(x))" в игре, значение всегда "x",

Заранее спасибо за помощь! Хорошего дня без ошибок!

1 ответ

Решение

Насмешка - все об ожиданиях. Когда вы пишете в своем тесте:

EXPECT_CALL(m_turtle, DoSomeMathTurtle(_, _))
  .Times(1)
  .WillOnce(Return(x));

Вы ожидаете, что m_turtle позвоню один раз DoSomeMathTurtle это будет принимать любые аргументы, и это будет один раз return x,

Так как x равен 2, то когда в следующий раз при использовании m_turtle.DoSomeMathTurtle(any_argument, any_argument); он вернется 2.

Если вы хотите проверить аргументы, вы должны искать совпадения в googlemock, например, когда вы делаете

EXPECT_CALL(m_turtle, DoSomeMathTurtle(Eq(3), Lt(3)))

вы ожидаете, что DoSomeMathTurtle будет принимать два аргумента, когда первый равен 3, а второй меньше 3.

Если вы хотите получить хороший результат в своем тесте, вы можете просто написать:

EXPECT_CALL(m_turtle, DoSomeMathTurtle(Eq(3), Eq(3)))
  .Times(1)
  .WillOnce(Return(6));
  rvalue = m_turtle.DoSomeMathTurtle(3,3); // rvalue is equal to 6
Другие вопросы по тегам