diff --git a/test/services/conftest.py b/test/services/conftest.py
index 9aee570a13f12985576708e9bac7740e5670b103..9557b1c5b091e51150ab78cf4b58c62f8018df8e 100644
--- a/test/services/conftest.py
+++ b/test/services/conftest.py
@@ -1,3 +1,8 @@
+from typing import Any
+
+from gso.services.kentik_client import NewKentikDevice
+
+
 class MockedNetboxClient:
     class BaseMockObject:
         def __init__(self, **kwargs):
@@ -57,3 +62,58 @@ class MockedSharePointClient:
     @staticmethod
     def add_list_item(list_name: str, fields: dict[str, str]) -> str:
         return f"http://{list_name}/{fields.popitem()}"
+
+
+class MockedKentikClient:
+    class BaseMockObject:
+        def __init__(self, **kwargs):
+            for key, value in kwargs.items():
+                setattr(self, key, value)
+
+    @staticmethod
+    def get_devices() -> list[dict[str, Any]]:
+        return [{"id": 0, "device_name": "device-1.internal"}, {"id": 1, "device_name": "device-2.internal"}]
+
+    @staticmethod
+    def get_device(device_id: str) -> dict[str, Any]:
+        return {"id": device_id, "device_name": "device-1.internal"}
+
+    @staticmethod
+    def get_device_by_name(fqdn: str) -> dict[str, Any]:
+        return {"id": 0, "device_name": fqdn}
+
+    @staticmethod
+    def get_sites() -> list[dict[str, Any]]:
+        return [{"id": 0, "site_name": "AMS"}, {"id": 1, "site_name": "BRU"}, {"id": 2, "site_name": "LUX"}]
+
+    @staticmethod
+    def get_site_by_name(site_name: str) -> dict[str, Any]:
+        return {"id": 0, "site_name": site_name}
+
+    @staticmethod
+    def get_plans() -> list[dict[str, Any]]:
+        return [{"id": 0, "plan_name": "kentik-plan-1"}, {"id": 1, "plan_name": "kentik-plan-2"}]
+
+    @staticmethod
+    def get_plan(plan_id: int) -> dict[str, Any]:
+        return {"id": plan_id, "plan_name": "kentik-mocked-plan"}
+
+    @staticmethod
+    def get_plan_by_name(plan_name: str) -> dict[str, Any]:
+        return {"id": 0, "plan_name": plan_name}
+
+    @staticmethod
+    def create_device(device: NewKentikDevice) -> dict[str, Any]:
+        return device.model_dump()
+
+    @staticmethod
+    def update_device(device_id: int, updated_device: dict[str, Any]) -> dict[str, Any]:
+        return {"id": device_id, **updated_device}
+
+    @staticmethod
+    def remove_device(device_id: int, *, archive: bool) -> None:
+        pass
+
+    @staticmethod
+    def remove_device_by_fqdn(fqdn: str, *, archive: bool) -> None:
+        pass
diff --git a/test/workflows/router/test_promote_p_to_pe.py b/test/workflows/router/test_promote_p_to_pe.py
index 90493d7e66ab4fedc178d524db352ce93c96f1b4..3bd7fdca1a65e0ad7bd0e1df59883cd020e9aca0 100644
--- a/test/workflows/router/test_promote_p_to_pe.py
+++ b/test/workflows/router/test_promote_p_to_pe.py
@@ -6,6 +6,7 @@ from pydantic_forms.exceptions import FormValidationError
 
 from gso.products.product_blocks.router import RouterRole
 from test import USER_CONFIRM_EMPTY_FORM
+from test.services.conftest import MockedKentikClient
 from test.workflows import (
     assert_complete,
     assert_lso_interaction_success,
@@ -17,19 +18,16 @@ from test.workflows import (
 
 @pytest.mark.workflow()
 @patch("gso.workflows.router.promote_p_to_pe.lso_client.execute_playbook")
-@patch("gso.workflows.router.promote_p_to_pe.KentikClient.create_device")
-@patch("gso.workflows.router.promote_p_to_pe.KentikClient.get_site_by_name")
+@patch("gso.workflows.router.promote_p_to_pe.KentikClient")
 def test_promote_p_to_pe_success(
-    mock_kentik_create_device,
-    mock_kentik_get_site_by_name,
+    mock_kentik_client,
     mock_execute_playbook,
     nokia_router_subscription_factory,
     data_config_filename,
     faker,
 ):
     """Test the successful promotion of a Nokia P router to a PE router."""
-    mock_kentik_create_device.return_value = {"id": faker.pyint()}
-    mock_kentik_get_site_by_name.return_value = {"id": faker.pyint()}
+    mock_kentik_client.return_value = MockedKentikClient
     router_id = nokia_router_subscription_factory(router_role=RouterRole.P, status=SubscriptionLifecycle.ACTIVE)
     input_data = [{"subscription_id": router_id}, {"tt_number": faker.tt_number()}]
     result, process_stat, step_log = run_workflow("promote_p_to_pe", input_data)
@@ -41,7 +39,6 @@ def test_promote_p_to_pe_success(
     state = extract_state(result)
     assert_complete(result)
     assert mock_execute_playbook.call_count == 22
-    assert mock_kentik_create_device.call_count == 1
     assert state["subscription"]["router"]["router_role"] == RouterRole.PE