I really like instance per test
# kotest
l
I really like instance per test
d
I find InstancePerLeaf useful for common test setup, and running the SUT and then I use the tests only for one assertion per test... but the current KoinListener doesn't work with that... Does this make sense to make it work?
Copy code
enum class KoinLifecycleMode {
    Root, Container, Test
}

typealias KoinListener = KoinExtension

class KoinExtension(
    private val modules: List<Module>,
    private val mockProvider: Provider<*>? = null,
    private val mode: KoinLifecycleMode
) : TestListener {

    constructor(
        module: Module,
        mockProvider: Provider<*>? = null,
    ) : this(listOf(module), mockProvider, KoinLifecycleMode.Test)

    constructor(
        module: Module,
        mockProvider: Provider<*>? = null,
        mode: KoinLifecycleMode
    ) : this(listOf(module), mockProvider, mode)

    constructor(
        modules: List<Module>,
        mockProvider: Provider<*>? = null,
    ) : this(modules, mockProvider, KoinLifecycleMode.Test)

    private fun TestCase.isApplicable() = (mode == KoinLifecycleMode.Root && description.isRootTest())
            || (mode == KoinLifecycleMode.Test && type == TestType.Test)
            || (mode == KoinLifecycleMode.Container && type == TestType.Container)

    override suspend fun beforeAny(testCase: TestCase) {
        if (testCase.isApplicable()) {
            if (KoinPlatformTools.defaultContext().getOrNull() == null)
                startKoin {
                    if (mockProvider != null) MockProvider.register(mockProvider)
                    modules(modules)
                }
        }
    }

    override suspend fun afterAny(testCase: TestCase, result: TestResult) {
        if (testCase.isApplicable()) {
            if (KoinPlatformTools.defaultContext().getOrNull() != null)
                stopKoin()
        }
    }
}