     private override init() {}
 
     // MARK: - CallKit proxy
-
-    private static var provider: CXProvider = {
-        let configuration = CXProviderConfiguration(localizedName: "")
-        return CXProvider(configuration: configuration)
-    }()
+    
+    public static var callKitProvider: CXProviderProtocol?
+    public static var callKitCallController: CXCallControllerProtocol?
+
+    private static var provider: CXProviderProtocol {
+        callKitProvider ?? defaultProvider
+    }
+    
+    private static var callController: CXCallControllerProtocol {
+        callKitCallController ?? defaultCallController
+    }
 
     private static var providerConfiguration: CXProviderConfiguration? {
         didSet {

    /// Defaults to enabled, set to false when you don't want to use CallKit.
    @objc public static var enabled: Bool = true {
        didSet {
            provider.invalidate()
            if enabled {
                guard isProviderConfigured() else  { return; }
                provider = CXProvider(configuration: providerConfiguration!)
                provider.setDelegate(emitter, queue: nil)
            } else {
                provider.setDelegate(nil, queue: nil)

            provider.setDelegate(emitter, queue: nil)
        }
    }
    
    private static let defaultCallController: CXCallController = {
        return CXCallController()
    }()
    
    private static var defaultProvider: CXProvider = {
        let configuration = CXProviderConfiguration(localizedName: "")
        return CXProvider(configuration: configuration)
    }()

    private static let emitter: JMCallKitEmitter = {
