Context Isolation
What Context Isolation?
For SDK Makers, you can also work with Koin in a non-global way: use Koin for the DI of your library and avoid any conflict by people using your library and Koin by isolating your context.
In a standard way, we can start Koin like that:
// start a KoinApplication and register it in Global context
startKoin {
    // declare used modules
    modules(...)
}
This uses the default Koin context to register your dependencies.
But if we want to use an isolated Koin instance, you need declare an instance and store it in a class to hold your instance. You will have to keep your Koin Application instance available in your library and pass it to your custom KoinComponent implementation:
The MyIsolatedKoinContext class is holding our Koin instance here:
// Get a Context for your Koin instance
object MyIsolatedKoinContext {
    private val koinApp = koinApplication {
        // declare used modules
        modules(coffeeAppModule)
    }
    val koin = koinApp.koin 
}
Let's use MyIsolatedKoinContext to define our IsolatedKoinComponent class, a KoinComponent that will use our isolated context:
internal interface IsolatedKoinComponent : KoinComponent {
    // Override default Koin instance
    override fun getKoin(): Koin = MyIsolatedKoinContext.koin
}
Everything is ready, just use IsolatedKoinComponent to retrieve instances from isolated context:
class MyKoinComponent : IsolatedKoinComponent {
    // inject & get will target MyKoinContext
}
Testing
To test classes that are retrieving dependencies with by inject() delegate override getKoin() method and define custom Koin module:
class MyClassTest : KoinTest {
    // Koin Context used to retrieve dependencies
    override fun getKoin(): Koin = MyIsolatedKoinContext.koin
    @Before
    fun setUp() {
       // Define custom Koin module
        val module = module {
            // Register dependencies
        }
        koin.loadModules(listOf(module))
    }
}