使用 Mockito 模拟扩展功能

灭霸渔夫

如何使用 Mockito 测试扩展功能?它似乎不太好用。

这是我的扩展功能

fun <T> CrudRepository<T, String>.findOneById(id: String): T? {
    val o = findById(id)
    return if (o.isPresent) o.get() else null
}

这就是我想要测试的

  @Test
    fun getIslandById() {
        //given
        BDDMockito.given(islandRepository.findOneById("islandId1"))
        .willReturn(IslandEntity(tileList, "1", "islandId1")) //findOneById is my extension function
        //when
        val island = islandService.getIslandById("islandId1")
        //then
        Assertions.assertThat(island?.id).isEqualTo("islandId1")
    }

但是前面的测试抛出以下错误

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
IslandEntity cannot be returned by findById()
findById() should return Optional

有任何想法吗?

科技狼

正如我在上面的评论中所说,字节码扩展函数只不过是接受接收者作为第一个参数的静态函数。因此你不能用 Mockito 模拟扩展函数,因为它不能模拟静态函数。

如果findById(id)由 Repository 实现而不是其他扩展功能,您可以做的是下一个:

findById(id)代替的模拟返回值

看看下面的示例代码:

@Test
fun getIslandById() {
    //given
    BDDMockito.given(islandRepository.findById("islandId1"))
    .willReturn(Optional.of(IslandEntity(tileList, "1", "islandId1"))) //mock findById function

    //when
    val island = islandService.getIslandById("islandId1")

    //then
    Assertions.assertThat(island?.id).isEqualTo("islandId1")
}

通过这种方式,您可以通过提供一个您希望它操作的模拟值来间接模拟您的扩展。

注意:您在上面发布的错误表明您findById(id)应该返回一个可选的。因此,findById(id)通过调用Optional.of(result).

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章