当前位置: 首页 > 知识库问答 >
问题:

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

包修贤
2023-03-14

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

首先,我试图模仿整个数据库对象,这创建了一个空接口异常。

为了解决这个问题,我使用了房间的静态对象生成器。(这是一个仪器化的单元测试,所以我可以访问底层的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.missing。InvalidUseOfMatchersException:在此处检测到错误放置或误用的参数匹配器:

-

不能在验证或存根之外使用参数匹配器。

共有2个答案

伊羽
2023-03-14

我并不完全为这个解决方案感到自豪,但它是有效的。我没有将完整的数据库对象传递给我的Repostory类的构造函数,而是创建了另一个直接接受道的覆盖构造函数。这样,我就可以简单地模拟道,而不必制作一些奇怪的数据库函数链,这些函数链根本不起作用。

沈凯康
2023-03-14

测试时,您可以将房间数据库构建为内存数据库。因此,存储的所有内容只会持续到进程关闭。所以没有什么会持续,完美的测试!

Code: Room.inMemoryDatabaseBuilder(context, TestDatabase::class.java).build()

 类似资料:
  • 我应该为依赖于的库的集成测试做出贡献,底层实现是用编写的。测试更倾向于流经一些属性的事件流。 以下存根是实际实现的一部分 现在,我要寻找的代码可能是 注意,我知道搜索。测试中的时间戳可以更新,但这需要在每个!! 但是有没有更好、更可靠的方法在规格2和/或scala中做到这一点? 编辑:我必须指出,我并不期待更改实现,以便用另一个类覆盖/包装。

  • 给定一个类Foo 为什么我用Spock来嘲笑Foo 调用总是返回false? 不确定这是否有区别,但测试是在Groovy/Spock中进行的,而Foo是在Java8中进行的。

  • 我正在为一个系统建模,该系统有一个创建资源的操作和其他消耗该资源的操作。然而,一个给定的资源只能被消耗一次——有没有一种方法可以保证在编译时这样做? 具体来说,假设第一个操作烘焙蛋糕,还有另外两个操作,一个用于“选择吃”蛋糕,另一个用于“选择吃蛋糕”,我只能做其中一个。 通过在我们使用蛋糕后在蛋糕上设置一个标志,很容易在运行时强制执行不保留已经吃过的蛋糕(反之亦然)的限制。但是有没有办法在编译时强

  • 我们想为房间数据库构建一个过滤器,过滤器选项由用户选择。 i、 e.我们有一个带有字段(id、名称、日期、类型)的实体。用户可以按日期和/或名称过滤列表,其中包含文本和/或类型等于某个值 有办法在房间里做吗?

  • 我希望从C中的浮点数组中计算中值: FloatArray包含一个常规的C浮点数组。 我正在使用,但想知道是否有像这样的工具可以处理数据?现在,我正在制作一个副本,然后在扔掉副本之前执行。如果数据没有像这样的东西,是否有更有效的方法使用复制步骤来计算信息,从而避免潜在的额外O(n)循环?也许性能影响可以忽略不计?我的数组大小可能在20亿量级。

  • 问题内容: 根据文档, spring batch admin非常容易嵌入到现有应用程序中。只需复制web.xml和index.jsp,然后添加所需的依赖项就足以使其正常工作。 但是,如果我想在现有的Spring Boot项目中使用它,那就越来越糟了。根据此示例,配置有些麻烦,但是可以使用。直到我尝试在我的configuriton bean中使用注释。然后我得到以下异常。 我的配置非常简单,我有两个