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)

0 ответов

Другие вопросы по тегам