diff --git a/tests/common.py b/tests/common.py
index 569813d221c..f7a2c04a5f5 100644
--- a/tests/common.py
+++ b/tests/common.py
@@ -34,6 +34,7 @@ from homeassistant.components.device_automation import (  # noqa: F401
     _async_get_device_automation_capabilities as async_get_device_automation_capabilities,
 )
 from homeassistant.config import async_process_component_config
+from homeassistant.config_entries import ConfigFlow
 from homeassistant.const import (
     DEVICE_DEFAULT_NAME,
     EVENT_HOMEASSISTANT_CLOSE,
@@ -1242,6 +1243,16 @@ async def get_system_health_info(hass: HomeAssistant, domain: str) -> dict[str,
     return await hass.data["system_health"][domain].info_callback(hass)
 
 
+@contextmanager
+def mock_config_flow(domain: str, config_flow: type[ConfigFlow]) -> None:
+    """Mock a config flow handler."""
+    assert domain not in config_entries.HANDLERS
+    config_entries.HANDLERS[domain] = config_flow
+    _LOGGER.info("Adding mock config flow: %s", domain)
+    yield
+    config_entries.HANDLERS.pop(domain)
+
+
 def mock_integration(
     hass: HomeAssistant, module: MockModule, built_in: bool = True
 ) -> loader.Integration:
diff --git a/tests/components/application_credentials/test_init.py b/tests/components/application_credentials/test_init.py
index 2f17340b071..cc56894cf0d 100644
--- a/tests/components/application_credentials/test_init.py
+++ b/tests/components/application_credentials/test_init.py
@@ -28,7 +28,7 @@ from homeassistant.core import HomeAssistant
 from homeassistant.helpers import config_entry_oauth2_flow
 from homeassistant.setup import async_setup_component
 
-from tests.common import MockConfigEntry, mock_platform
+from tests.common import MockConfigEntry, mock_config_flow, mock_platform
 from tests.test_util.aiohttp import AiohttpClientMocker
 from tests.typing import ClientSessionGenerator, WebSocketGenerator
 
@@ -98,7 +98,7 @@ async def mock_application_credentials_integration(
         yield
 
 
-class FakeConfigFlow(config_entry_oauth2_flow.AbstractOAuth2FlowHandler, domain=DOMAIN):
+class FakeConfigFlow(config_entry_oauth2_flow.AbstractOAuth2FlowHandler):
     """Config flow used during tests."""
 
     DOMAIN = TEST_DOMAIN
@@ -115,8 +115,8 @@ def config_flow_handler(
 ) -> Generator[FakeConfigFlow, None, None]:
     """Fixture for a test config flow."""
     mock_platform(hass, f"{TEST_DOMAIN}.config_flow")
-    with patch.dict(config_entries.HANDLERS, {TEST_DOMAIN: FakeConfigFlow}):
-        yield FakeConfigFlow
+    with mock_config_flow(TEST_DOMAIN, FakeConfigFlow):
+        yield
 
 
 class OAuthFixture:
diff --git a/tests/components/hassio/test_discovery.py b/tests/components/hassio/test_discovery.py
index 2cb4aa206db..51659927dfa 100644
--- a/tests/components/hassio/test_discovery.py
+++ b/tests/components/hassio/test_discovery.py
@@ -12,7 +12,12 @@ from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_S
 from homeassistant.core import HomeAssistant
 from homeassistant.setup import async_setup_component
 
-from tests.common import MockModule, mock_entity_platform, mock_integration
+from tests.common import (
+    MockModule,
+    mock_config_flow,
+    mock_entity_platform,
+    mock_integration,
+)
 from tests.test_util.aiohttp import AiohttpClientMocker
 
 
@@ -22,15 +27,14 @@ async def mock_mqtt_fixture(hass):
     mock_integration(hass, MockModule(MQTT_DOMAIN))
     mock_entity_platform(hass, f"config_flow.{MQTT_DOMAIN}", None)
 
-    with patch.dict(config_entries.HANDLERS):
+    class MqttFlow(config_entries.ConfigFlow):
+        """Test flow."""
 
-        class MqttFlow(config_entries.ConfigFlow, domain=MQTT_DOMAIN):
-            """Test flow."""
+        VERSION = 1
 
-            VERSION = 1
-
-            async_step_hassio = AsyncMock(return_value={"type": "abort"})
+        async_step_hassio = AsyncMock(return_value={"type": "abort"})
 
+    with mock_config_flow(MQTT_DOMAIN, MqttFlow):
         yield MqttFlow
 
 
diff --git a/tests/components/homeassistant_hardware/test_silabs_multiprotocol_addon.py b/tests/components/homeassistant_hardware/test_silabs_multiprotocol_addon.py
index abe66d35a96..57e4a23ab5f 100644
--- a/tests/components/homeassistant_hardware/test_silabs_multiprotocol_addon.py
+++ b/tests/components/homeassistant_hardware/test_silabs_multiprotocol_addon.py
@@ -7,7 +7,6 @@ from unittest.mock import Mock, patch
 
 import pytest
 
-from homeassistant import config_entries
 from homeassistant.components.hassio.handler import HassioAPIError
 from homeassistant.components.homeassistant_hardware import silabs_multiprotocol_addon
 from homeassistant.components.zha.core.const import DOMAIN as ZHA_DOMAIN
@@ -15,12 +14,18 @@ from homeassistant.config_entries import ConfigEntry, ConfigFlow
 from homeassistant.core import HomeAssistant, callback
 from homeassistant.data_entry_flow import FlowResult, FlowResultType
 
-from tests.common import MockConfigEntry, MockModule, mock_integration, mock_platform
+from tests.common import (
+    MockConfigEntry,
+    MockModule,
+    mock_config_flow,
+    mock_integration,
+    mock_platform,
+)
 
 TEST_DOMAIN = "test"
 
 
-class TestConfigFlow(ConfigFlow, domain=TEST_DOMAIN):
+class TestConfigFlow(ConfigFlow):
     """Handle a config flow for the silabs multiprotocol add-on."""
 
     VERSION = 1
@@ -87,8 +92,8 @@ def config_flow_handler(
 ) -> Generator[TestConfigFlow, None, None]:
     """Fixture for a test config flow."""
     mock_platform(hass, f"{TEST_DOMAIN}.config_flow")
-    with patch.dict(config_entries.HANDLERS, {TEST_DOMAIN: TestConfigFlow}):
-        yield TestConfigFlow
+    with mock_config_flow(TEST_DOMAIN, TestConfigFlow):
+        yield
 
 
 async def test_option_flow_install_multi_pan_addon(