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