У меня есть шаблон сценария, как:
// this function is called as timer callback
void funcToBeCalled ();
Timer t;
void
push_data ()
{
if (t.isRunning ())
{
return;
}
t.start (oneshot = true);
}
//TestCase
EXPECT_CALL(mockObj,funcToBeCalled).Times(1);
push_data ();
push_data ();
push_data ();
Цель - когда push_data () вызывается n раз за период времени t, он будет привязан к обратному вызову таймера, поэтому только один раз funcToBeCalled()
будет вызывать весь запрос push_data после того, как время t будет проигнорировано.
Вышеприведенный случай является прототипом и тестирование прошло успешно. Вы можете предположить, что макет корректен.
Но я хочу, чтобы у меня был такой тест:
#define TIMER_TIMEOUT 10
bool funcToBeCalled ();
Timer t;
void
push_data ()
{
if (t.isRunning ())
{
return;
}
t.start (TIMER_TIMEOUT, oneshot = true);
}
// TestCase
SharedSignal msgnal;
EXPECT_CALL (mockObj,
funcToBeCalled).Times (2).
WillOnce (Return (true)).WillOnce (SetSignal (msgnal));
push_data ();
push_data ();
push_data ();
Sleep (TIMER_TIMEOUT);
push_data ();
push_data ();
push_data ();
msgnal.wait (5 * TIMER_TIMEOUT);
Sleep гарантирует, что время первого окна истекло, следует сделать второй вызов funcToBeCalled()
.
Я не хочу использовать проверку Mock::VerifyAndClearExpectations
он не имитирует одно длительное окно, вместо этого он имитирует два временных окна с нуля.
Как мне выполнить этот контрольный пример с помощью Google Test Framework?