Kotest Koin拡張

Kotest Koin拡張について紹介する。

Koin DI Frameworkは、KoinExtension拡張を通じてKotestと一緒に使用できる。

プロジェクトで拡張を使用するには、プロジェクトに依存関係を追加する。

io.kotest.extensions:kotest-extensions-koin:${version}

依存関係が追加されると、テストでKoinを簡単に使用できる。

class KotestAndKoin : FunSpec(), KoinTest {

    override fun extensions() = listOf(KoinExtension(myKoinModule))

    val userService by inject<UserService>()

    init {
        test("use userService") {
            userService.getUser().username shouldBe "LeoColman"
        }
    }
}

デフォルトでは、拡張はリーフテスト(leaf test)間でKoinコンテキストを開始/停止する。DescribeSpecのようなネストされたSpecスタイルを使用し、ルートテストのすべてのリーフにわたってKoinコンテキストを維持したい場合、たとえばテスト間でモック宣言を共有するためには、KoinExtensionコンストラクタでライフサイクルモードをKoinLifecycleMode.Rootに指定できる。

class KotestAndKoin : DescribeSpec(), KoinTest {

    override fun extensions() = listOf(KoinExtension(module = myKoinModule, mode = KoinLifecycleMode.Root))

    val userService by inject<UserService>()

    init {
        describe("use userService") {
            it("inside a leaf test") {
                userService.getUser().username shouldBe "LeoColman"
            }
            it("this shares the same context") {
                userService.getUser().username shouldBe "LeoColman"
            }
        }
    }
}

参照