【发布时间】:2018-04-05 08:17:23
【问题描述】:
我有一个相当简单的save() 方法来持久化一个RealmModel,在保存realm.close() 之后因为不再需要数据库而被调用。
问题:虽然 Realm 是使用 mockito 模拟的,但实际调用了 close() 方法。这会导致异常:
IllegalStateException:来自错误线程的领域访问。 Realm 实例只能在它创建的线程上关闭。
mockito 不能模拟 Realm 吗?我不想仅仅为了测试这个案例而包含 PowerMock:D
使用realm-gradle-plugin 5.0.0 测试
被测试的类
import io.realm.Realm
import io.realm.RealmModel
class TestedClass {
fun save(realm: Realm, objectToBeSaved: RealmModel) {
// Persist your data in a transaction
realm.executeTransaction {
// Using executeTransaction with a lambda reduces code size
// and makes it impossible to forget to commit the transaction.
it.copyToRealm(objectToBeSaved)
}
// Close database after saving (this causes the exception)
realm.close()
}
}
单元测试
import com.nhaarman.mockito_kotlin.any
import com.nhaarman.mockito_kotlin.mock
import com.nhaarman.mockito_kotlin.verify
@Test
fun save() {
val testedClass = TestedClass()
val mockRealm: Realm = mock()
val objectToBeSaved: RealmModel = mock()
testedClass.save(mockRealm, objectToBeSaved) // this causes the exception
verify(mockRealm).executeTransaction(any())
verify(mockRealm).copyToRealm(objectToBeSaved)
verify(mockRealm).close()
}
【问题讨论】:
-
你试过
Mockito.when(mockRealm.close()).doNothing()之类的吗? -
是的,我试过
doNothing().whenever(mockRealm).close() -
您使用的是什么版本的领域?
-
我使用的是 5.0.0 版,我更新了我的问题以反映这一点,并且我给出了适用于较新版本的答案。
标签: android unit-testing kotlin realm mockito