首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用MockK测试挂起功能?

如何使用MockK测试挂起功能?
EN

Stack Overflow用户
提问于 2021-09-01 13:26:22
回答 1查看 473关注 0票数 3

我正在为我的Datarepository层编写一个单元测试,它只是调用一个接口。我使用Kotlin、协程和MockK进行单元测试。在MockK中,我如何验证我调用了apiServiceInterface.getDataFromApi()并且只调用了一次?我应该把代码放在runBlocking中吗?

这是我的代码:

UnitTest

代码语言:javascript
运行
复制
import com.example.breakingbad.api.ApiServiceInterface
import com.example.breakingbad.data.DataRepository
import io.mockk.impl.annotations.InjectMockKs
import io.mockk.impl.annotations.MockK
import io.mockk.verify
import org.junit.Test

存储库

代码语言:javascript
运行
复制
class DataRepositoryTest {
    @MockK
    private lateinit var apiServiceInterface: ApiServiceInterface

    @InjectMockKs
    private lateinit var dataRepository: DataRepository

    @Test
    fun getCharacters() {
            val respose = dataRepository.getCharacters()
            verify { apiServiceInterface.getDataFromApi() }
    }
}

    class DataRepository @Inject constructor(
    private val apiServiceInterface: ApiServiceInterface
) {
    suspend fun getCharacters(): Result<ArrayList<Character>> = kotlin.runCatching{
        apiServiceInterface.getDataFromApi()
    }
}

接口

代码语言:javascript
运行
复制
interface ApiServiceInterface {
    @GET("api/characters")
    suspend fun getDataFromApi(): ArrayList<Character>
}
EN

Stack Overflow用户

发布于 2021-11-28 12:12:28

是的,您应该将dataRepository.getCharacters()调用放在一个runBlocking中。

并且应该将coVerify替换为verify

最后,测试应该是这样的:

代码语言:javascript
运行
复制
@Test
fun getCharacters() {
    val respose = runBlocking { dataRepository.getCharacters() }
    
    coVerify { apiServiceInterface.getDataFromApi() }
}

此外,由于您希望验证它只发生过一次,因此需要使用确切的参数coVerify(exactly = 1)调用coVerify

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69014652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档