我在 kotlin 多平台中实现了一个小型应用程序,使用 Room 没有任何问题。 但现在我面临着为 DAO 创建测试的挑战,因为我需要上下文来创建内存数据库以在公共代码中运行测试。 iOS 和 Android 的测试是 100% 相同的,只是我启动数据库的方式不同,因为 Android 需要 Context。 我只对移动部署感兴趣。
有谁知道如何解决这个问题而不将测试复制到 android 和 iOS 测试文件夹(又名重复测试)?
编辑1: 我正在使用预期函数和实际函数为 Android 和 iOS 应用程序创建房间数据库,但在创建要在共享代码测试中使用的内存数据库时遇到问题,因为 Android 的内存数据库需要 android 上下文。
您可以使用 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()
}
}