Test Room DAO 在 kotlin 多平台中的实现

问题描述 投票:0回答:1

我在 kotlin 多平台中实现了一个小型应用程序,使用 Room 没有任何问题。 但现在我面临着为 DAO 创建测试的挑战,因为我需要上下文来创建内存数据库以在公共代码中运行测试。 iOS 和 Android 的测试是 100% 相同的,只是我启动数据库的方式不同,因为 Android 需要 Context。 我只对移动部署感兴趣。

有谁知道如何解决这个问题而不将测试复制到 android 和 iOS 测试文件夹(又名重复测试)?

编辑1: 我正在使用预期函数和实际函数为 Android 和 iOS 应用程序创建房间数据库,但在创建要在共享代码测试中使用的内存数据库时遇到问题,因为 Android 的内存数据库需要 android 上下文。

kotlin android-room kotlin-multiplatform kotest
1个回答
0
投票

您可以使用 Robolectric 来获取 androidUnitTest 中的 Context。

请参阅以下示例:

/// commonTest
expect open class RobolectricTest()

expect abstract class RoomDatabaseTest() : RobolectricTest {
    fun getInMemoryDatabaseBuilder(): RoomDatabase.Builder<ProductivityDatabase>
}

...

class LocalDataRepositoryTest : RoomDatabaseTest() {
    private lateinit var db: ProductivityDatabase

    @AfterTest
    fun after() {
        db.close()
    }

    @BeforeTest
    fun setup() = runTest {
        db = getInMemoryDatabaseBuilder().build()
...

/// androidUnitTest

@RunWith(RobolectricTestRunner::class)
@Ignore("This is used as an interface")
actual open class RobolectricTest actual constructor()

...

expect abstract class RoomDatabaseTest() : RobolectricTest {
    fun getInMemoryDatabaseBuilder(): RoomDatabase.Builder<ProductivityDatabase>
}

actual abstract class RoomDatabaseTest : RobolectricTest() {
    actual fun getInMemoryDatabaseBuilder(): RoomDatabase.Builder<ProductivityDatabase> {
        return Room.inMemoryDatabaseBuilder(
            InstrumentationRegistry.getInstrumentation().context,
            ProductivityDatabase::class.java,
        )
    }
}

// iosTest

actual open class RobolectricTest actual constructor()

actual abstract class RoomDatabaseTest : RobolectricTest() {
    actual fun getInMemoryDatabaseBuilder(): RoomDatabase.Builder<ProductivityDatabase> {
        return Room.inMemoryDatabaseBuilder()
    }
}

这里也提到了这一点:https://issuetracker.google.com/issues/388863167

© www.soinside.com 2019 - 2024. All rights reserved.