Gmock ожидает EXPECT_CALL с использованием условных переменных и мьютекса вместо QTest::qWait(мс)
В настоящее время мой unittest использует QTest::qWait(мс), чтобы дать достаточно времени для перехвата сигнала DBUS и слота для выполнения теста EXPECT_CALL. Я хочу удалить ожидание и сделать GMock EXPECT_CALL, используя std::condition_variable и std::mutex, для ожидания вызова.
Используя информацию, найденную здесь: ожидание вызовов googlemock из другого потока, я получил следующий код;
std::condition_variable cv;
std::mutex mu;
bool ready{false};
BatteryLevelEvent batteryFlatEvt(EventType::EVT_BATTERY_FLAT, 12,
"MockEvent");
// setting up the expected call on the DB
EXPECT_CALL(mock_db_, Insert(batteryFlatEvt.ToString()))
.Times(1)
.WillOnce(InvokeWithoutArgs([&]() {
std::lock_guard<std::mutex> lock(mu);
ready = true;
cv.notify_one();
}));
// send DBUS message to trigger the Insert(...) call on mock_db_
connection.send(batteryLevelEventSignal);
// QTest::qWait(1000); //<-- test passes with this!
// test fails after 5 seconds
std::unique_lock<std::mutex> lock(mu);
EXPECT_TRUE(
cv.wait_for(lock, std::chrono::seconds(5), [&ready] { return ready; }));
lock.unlock();
Mock::VerifyAndClearExpectations(&mock_db_);
Сигнал определенно отправляется, как я вижу на dbus-мониторе
Спасибо огромное за вашу помощь.
С помощью;
C++ 11,
Гтест Мастер Филиал,
Результаты...
Actual function call count doesn't match EXPECT_CALL(mock_db_, Insert(batteryFlatEvt.ToString()))...
Expected: to be called once
Actual: never called - unsatisfied and active
[ FAILED ] EventServiceTester.TestReceivingEventSignals (5002 ms)
используя QTest:qWait(мс)
[ OK ] EventServiceTester.TestReceivingEventSignals (1002 ms)