android - 有没有办法正确模拟房间数据库?

标签 android unit-testing kotlin mockito android-room

我正在尝试使用 Mockito 模拟我的房间数据库,以便我可以在我的存储库中测试复杂的算法。无论我朝哪个方向迈进,我都会遇到很多不同的错误。

首先我尝试只模拟整个数据库对象,这创建了一个空接口(interface)异常。

为了解决这个问题,我使用了 Room 的静态对象生成器。 (这是一个插桩单元测试,所以我可以访问底层的 Android 依赖项)

import org.mockito.*
import org.mockito.Mockito.`when`
import org.mockito.Mockito.anyDouble

class BasicReposTest {


@get:Rule
val activityRule = ActivityTestRule(MainActivity::class.java)

@get:Rule
val mockitoRule: MockitoRule = MockitoJUnit.rule()

@Mock
lateinit var mockedDb : AppDatabase

@Before
fun setTheDatabase() {
    val context = ApplicationProvider.getApplicationContext<Context>()

    mockedDb = Room.inMemoryDatabaseBuilder(
        context, AppDatabase::class.java).build()

}

@Test
fun doesReposRequestBounds() {

    `when`(mockedDb.momentDao().findMomentsByBound(ArgumentMatchers.anyDouble(), ArgumentMatchers.anyDouble(),
        anyDouble(), ArgumentMatchers.anyDouble())).thenReturn(momentList)

    //Request first set of moments
    repos.queryMapMoments(bounds, 20.toFloat())
    //Do we get a list of moments sent to livedata?
    assertTrue(mappedMoments.value!!.size >= momentList.size)

    val list : List<Moment> = mappedMoments.value!!

    for (value in list) {
        System.out.println("D " + "RequestMomentsFromDatabaseByBoundsTest    " + "MID = " + value.mId )
    }
}

有了这个,我收到了一个误用的匹配器异常...... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 此处检测到放错位置或误用的参数匹配器:

-> 在 com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:138) -> 在 com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:138) -> 在 com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:139) -> 在 com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:139)`

您不能在验证或 stub 之外使用参数匹配器。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

最佳答案

测试时,您可以将房间数据库构建为内存数据库。因此,存储的所有内容只会持续到进程关闭。所以什么都不会持久,非常适合测试!

代码: Room.inMemoryDatabaseBuilder(上下文, TestDatabase::class.java).build()

关于android - 有没有办法正确模拟房间数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55580267/

相关文章:

Android Studio 3.1.1 (AVD) 模拟器无法启动

java - Android Studio 重构恢复所有 lambda 和其他 Java 8 功能

python - 如何测试在对象构造期间调用导入模块上的方法

java - 使用参数化测试的多个实例创建 JUnit 测试套件

android - 在MVVM中,ViewModel总是必要的吗?

android - 如何将 GeoPoint 从 Firebase - Firestore 映射到 Android 中的 Kotlin DTO 对象

android - 使用 ViewPager 的 CollapsingToolbarLayout

java - 在 Canvas 上以更好的分辨率绘画? (安卓)

javascript - AngularJs 测试。放置模板的位置

android - 列出 BLE 设备 Android - Kotlin