Задать вопрос
max_dark
@max_dark
Диванный эксперт

Как в Google Mock задать последовательность вызовов?

Пишу тесты для Callback objects(Command pattern).
Мне нужно проверить, что два метода вызываются перед третим и передают в него ожидаемые значения.
Причем первые могут быть использованы в любом порядке.
Как пример: чтение двух значений -> вычисления -> возврат результата.

Сейчас я могу только жестко задать последовательность, хотя перестановка вызовов местами ошибкой не является.

Пример кода:
MockVM mockVm;
Sequence csr;

EXPECT_CALL(mockVm, get_control(csr_id, _))
                    .InSequence(csr)
                    .WillOnce(SetArgReferee<1>(csr_val));
EXPECT_CALL(mockVm, get_register(src))
                .InSequence(csr)
                .WillOnce(Return(src_val));

EXPECT_CALL(mockVm, set_control(csr_id, expected_csr_value))
                .InSequence(csr);
impl->exec(&mockVm, &code);

Здесь get_control и get_register могут быть вызваны в любом порядке.

Как это можно описать в gMock?

Как в gMock проверить что метод НЕ вызывается?
  • Вопрос задан
  • 60 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@Furax
Для проверки последовательности вызовов вам нужен метод (или часовой) InSequence.

Для проверки, что метод не вызывается, можно сделать EXPECT_CALL(...).Times(0).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
max_dark
@max_dark Автор вопроса
Диванный эксперт
Воспользовался комбинацией из .InSequence и .After + добавил .Times(0) для особого случая

TEST_F(RV32I_Handler_System, CSR_RS)
{
    auto impl = create<csrrs>();
    constexpr Code funcA = 0b0010;

    ASSERT_TRUE(impl->getId().equal(expectedId(funcA)));
    for (register_no src = 0; src < vm::register_count; ++src) {
        vm::register_t csr_id = 0;
        vm::register_t csr_val = 0;
        vm::register_t src_val = 0;
        register_no dst = RegAlias::t0;
        auto code = encode(funcA, dst, src, csr_id);
        MockVM mockVm;

        Sequence csr_get, csr_set;
        Expectation was_read = EXPECT_CALL(mockVm, control_get(csr_id, _))
                .InSequence(csr_get);
        EXPECT_CALL(mockVm, set_register(dst, _))
                .InSequence(csr_get);
        if (src == 0)
        {
            EXPECT_CALL(mockVm, control_set(_, _))
                .Times(0);
        }
        else
        {
            EXPECT_CALL(mockVm, get_register(src))
                    .InSequence(csr_set)
                    .WillOnce(Return(0));
            EXPECT_CALL(mockVm, control_set(csr_id, _))
                    .InSequence(csr_set)
                    .After(was_read);
        }
        impl->exec(&mockVm, &code);
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы