尽管在 Android (Kotlin) 中成功保存,但领域测试失败

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

我正在使用 Kotlin 协程在 Android 应用程序中测试 Realm 数据库。我有一个带有 isEmpty() 方法的 ConnectionsRepository,并且我正在编写一个单元测试,该测试在保存 Connection 对象之前和之后断言行为。然而,即使日志显示保存成功,测试也会失败

方法

// ConnectionsRepository
override fun isEmpty(): Boolean {
    return RealmManager.getDefaultInstance().use { realm ->
        realm.where(Connection::class.java).count() == 0L
    }
}

suspend fun Connection.save(): Connection? = ConnectionsRepository.saveModel(this) 

override suspend fun saveModel(connection: Connection): Connection? {
    if (connection.createdAt == 0L) connection.createdAt = 
        DateTime.now().withZone(DateTimeZone.UTC).millis
    connection.updatedAt = DateTime.now().withZone(DateTimeZone.UTC).millis

    return withContext(Dispatchers.IO) {
        var savedConnection: Connection? = null
        RealmManager.getDefaultInstance().use { realmDb ->
            realmDb.executeTransaction { transaction ->
                Log.d("RealmTransaction", "Saving connection: $connection")
                savedConnection = realmDb.copyFromRealm(transaction.copyToRealmOrUpdate(connection))
            }
        }
        if (savedConnection == null) {
            Log.e("Error", "Connection was saved with error")
        } else {
            Log.e("Error", "Connection was saved successfully: $savedConnection")
        }
        savedConnection
    }
}

测试

@RunWith(AndroidJUnit4::class)
@OptIn(ExperimentalCoroutinesApi::class)
class ConnectionsRepositoryTest : DatabaseTestCase() {

    @Test
    @Throws(Exception::class)
    fun isEmptyTest() = runBlockingTest {
        Assert.assertTrue(ConnectionsRepository.isEmpty())

        runBlocking {
            Connection().setGuid("guid1").setId("1").setAccessToken("token4").save()
            advanceUntilIdle()  // Wait for coroutine completion
        }

        Assert.assertFalse(ConnectionsRepository.isEmpty()) 
    } 
} 

日志

04-04 16:55:47.713 22806 22836 D RealmTransaction: Saving connection: Connection(...)
04-04 16:55:47.716 22806 22836 E Error: Connection was saved successfully: Connection(...)

故障排除

我已经验证日志记录表明连接对象已成功保存。 我正在使用 advanceUntilIdle 来等待协程完全完成。

问题

为什么我的测试仍然失败并出现断言错误?这可能是领域缓存或同步的问题吗?

请注意

我愿意接受有关改进测试或代码结构的建议。 如果需要,我可以提供其他代码片段,例如 RealmManager.getDefaultInstance()。 预先感谢您的帮助!

android kotlin realm android-testing
1个回答
0
投票

就我而言,我通过重构当前的 saveModel 方法(特别是使用executeTransactionAwait)得到了帮助。大概是这样的:

override suspend fun saveModel(connection: Connection): Connection? {
    if (connection.createdAt == 0L) connection.createdAt = DateTime.now().withZone(DateTimeZone.UTC).millis
    connection.updatedAt = DateTime.now().withZone(DateTimeZone.UTC).millis

    var resultConnection: Connection? = null
    RealmManager.getDefaultInstance().use { realmDb ->
        realmDb.executeTransactionAwait { transactionRealm ->
            resultConnection = transactionRealm.copyFromRealm(transactionRealm.copyToRealmOrUpdate(connection))
        }
    }
    return resultConnection
}
© www.soinside.com 2019 - 2024. All rights reserved.