TEST(QThreadCleanupTest, givenQThread_whenInvokeMethodAfterStopped_thenItShouldCleanup) { bool cleanedUp = false; { // GIVEN: QThread t; QObject o; o.moveToThread(&t); t.start(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); t.quit(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); // WHEN: QMetaObject::invokeMethod(&o, [p = std::shared_ptr(&cleanedUp, [&cleanedUp](auto /*unused*/) { cleanedUp = true; })] {}); t.wait(); } // THEN: EXPECT_TRUE(cleanedUp); }