Как указать последовательные возвраты в gmock?

В Mockito мы можем указать несколько возвратов, как (взяты из Вот):

//you can set different behavior for consecutive method calls.
//Last stubbing (e.g: thenReturn("foo")) determines the behavior of further consecutive calls.
when(mock.someMethod("some arg"))
.thenReturn(new RuntimeException())
.thenReturn("foo");

//There is a shorter way of consecutive stubbing:
when(mock.someMethod()).thenReturn(1,2,3);
when(mock.otherMethod()).thenThrow(exc1, exc2);

Есть ли способ указать несколько возвратов для макета, сделанного с помощью gmock? В настоящее время у меня есть:

store_mock_ = std::make_shared<StorageMock>();
ON_CALL(*store_mock_, getFileName(_)).Return("file1").Return("file2");

который не компилируется, потому что я не могу понять несколько возвращений в gmock. Это возможно с Gmock? Если нет, есть ли другой способ решить эту проблему? Я обнаружил, что мы можем EXPECT множественные возвращаемые значения, такие как:

using ::testing::Return;...
EXPECT_CALL(turtle, GetX())
.WillOnce(Return(100))
.WillOnce(Return(200))
.WillOnce(Return(300));

Тем не менее, я не нашел никаких документов, чтобы высмеивать несколько возвратов с ON_CALL,

12

Решение

ON_CALL больше используется для установки поведения функции по умолчанию. То есть вы знаете, что в тестируемом коде вызывается смоделированная функция, вы хотите установить некоторое значение по умолчанию, но на самом деле не важно, сколько раз вызывается функция.

пример:

  ON_CALL(foo, Sign(_))
.WillByDefault(Return(-1));
ON_CALL(foo, Sign(0))
.WillByDefault(Return(0));
ON_CALL(foo, Sign(Gt(0)))
.WillByDefault(Return(1));

Чтобы получить желаемое поведение, я бы использовал ожидания — Вы уже предоставили пример, о котором идет речь, просто чтобы показать больше — пример, когда вы ожидаете 1, 2 тогда всегда 3:

  EXPECT_CALL(foo, Sign(_))
.WillOnce(Return(1))
.WillOnce(Return(2))
.WillRepeatedly(Return(3));

EXPECT_CALL «путь» может быть проблематичным, если вы хотите установить это в тестовом приборе SetUp — и некоторые тесты могут вызвать foo только однажды. Но, конечно, есть способы «контролировать» ON_CALL вернуть значение для последующих вызовов — но вы должны сделать это с помощью специальных действий — таких как получение результата некоторой функции — как в этом примере:

class IDummy
{
public:
virtual int foo() = 0;
};

class DummyMock : public IDummy
{
public:
MOCK_METHOD0(foo, int());
};
using namespace ::testing;
class DummyTestSuite : public Test
{
protected:
DummyMock dummy;
void SetUp() override
{
ON_CALL(dummy, foo())
.WillByDefault(
InvokeWithoutArgs(this, &DummyTestSuite::IncrementDummy));
}
int dummyValue = 0;
int IncrementDummy()
{
return ++dummyValue;
}

};TEST_F(DummyTestSuite, aaa)
{
ASSERT_EQ(1, dummy.foo());
ASSERT_EQ(2, dummy.foo());
ASSERT_EQ(3, dummy.foo());

}
13

Другие решения

@ PiotrNycz ответ правильный и предпочтительное решение.

Альтернативный подход через лямбда-функцию может дать вам больше гибкости:

uint32_t callCount = 0;
ON_CALL(*turtle, GetX())
.WillByDefault(testing::Invoke(
[&callCount]() -> int {
return ++callCount * 100;
}
));
0

По вопросам рекламы [email protected]