Можно ли смоделировать метод, который получает указатель (или ссылку) в качестве аргумента и изменить указанный объект?
Я использую библиотеку черепах — http://turtle.sourceforge.net/ -> C ++ библиотека макетов объектов для Boost. (Я знаю, что это не популярная библиотека, но она может быть похожа в других библиотеках).
Например: мне нужно смоделировать метод как:
int f(int* x)
{
*x = new_value;
return 0;
}
Следующая SUT использует значение x в коде 🙁
В объяснениях я могу установить, что возвращает мой макет. Но как насчет измененного аргумента?
Как это сделать?
Посмотрите на звонки и ответные действия:
http://turtle.sourceforge.net/turtle/reference.html#turtle.reference.expectation.actions
Вы можете создать вспомогательную функцию в своем тесте, которая изменяет x так, как вы хотите. Передайте x этой функции.
int function( int* x )
{
*x = whatever;
return 0;
}
MOCK_EXPECT(mock->f).calls( &function );
Надеюсь это поможет.
Притворяться это простая фреймворк для C ++. Он поддерживает как GCC, так и MS Visual C ++.
Вот как вы заглушаете метод и изменяете указанный объект с помощью FakeIt:
struct SomeClass {
virtual int foo(int * x) = 0;
};
Mock<SomeClass> mock;
When(Method(mock,foo)).AlwaysDo([](int * x) { (*x)++; return 0;});
SomeClass &obj = mock.get();
int num = 0;
ASSERT_EQUAL(0, obj.foo(&num)); // foo should return 0;
ASSERT_EQUAL(1, num); // num should be 1 after one call to foo;