Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于mock的Android测试视图模型_Android_Kotlin_Mockk - Fatal编程技术网

基于mock的Android测试视图模型

基于mock的Android测试视图模型,android,kotlin,mockk,Android,Kotlin,Mockk,我正试图用mock库测试我的视图模型。但我不知道该怎么做。这是我的课。我有一个用例和一个存储库: @ExperimentalCoroutinesApi class MainViewModelTest { private val getRecentPhotosUseCase:GetRecentPhotosUseCase= mockk() private val recentPhotosRepository:RemoteRecentPhotosRepository= moc

我正试图用mock库测试我的视图模型。但我不知道该怎么做。这是我的课。我有一个用例和一个存储库:

    @ExperimentalCoroutinesApi
class MainViewModelTest {

    private val getRecentPhotosUseCase:GetRecentPhotosUseCase= mockk()
    private val recentPhotosRepository:RemoteRecentPhotosRepository= mockk()
    private val mainViewModel by lazy { RecentPhotosViewModel(getRecentPhotosUseCase) }
    @ExperimentalCoroutinesApi
    @get:Rule
    var mainCoroutineRule = MainCoroutineRule()

    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()

    @Before
    fun setupBefore(){
        startKoin {
            androidContext(App.getInstance())
            if (BuildConfig.DEBUG) androidLogger(Level.DEBUG)
            modules(appModules + domainModules + dataModules)
        }
    }

    @Test
    fun `get recent photo success`(){
         val map: MutableMap<String, String> = HashMap()
    map["format"] = "json"
    map["method"] = "flickr.photos.getRecent1"
    map["nojsoncallback"]="1"
    map["per_page"]="20"
    map["page"]= "1"
    val recentPhotoResponse = mockk<RecentPhotos>()
    //1- Mock calls
    every { runBlocking {recentPhotosRepository.getRecentPhotos(map)} } returns Success(recentPhotoResponse)
    mainViewModel.viewState.observeForever {  }
    runBlocking {mainViewModel.getRecentPhotos(map)}
    val getRecentPhotoSuccess= mainViewModel.viewState.value
    MatcherAssert.assertThat(
        "Received result [$getRecentPhotoSuccess] & mocked ${OnSuccess(recentPhotoResponse)} must be matches on each other!",
        getRecentPhotoSuccess,
        CoreMatchers.`is`(OnSuccess(recentPhotoResponse))
    )
    }
}

您需要告诉mock
getRecentPhotosUseCase.function(…)
的返回值是多少。您可以这样做:
每个{mock.call(…)}返回值
。您可以为参数放置
any()
,也可以使用具体值:

every{getRecentPhotosUseCase.function(any(),any(),…)}返回您的结果值
//或
每个{getRecentPhotosUseCase.function(per_page=20,…)}返回您的结果值
或者,如果您不想模拟
GetRecentPhotosUseCase
的结果(可能是因为它与您的测试场景相关),您可以使用:

轻松模拟是为所有函数返回一些简单值的模拟。这允许跳过为每种情况指定行为,同时仍然允许存根您需要的东西。对于引用类型,将返回链接的模拟

val getrecentphotousecase:getrecentphotousecase=mock(relaxed=true)

分享您的GetRecentPhotosUseCase类谢谢。你的解决方案奏效了。但是我不知道为什么Assert会失败。两个OnSuccess类都是相同的,但是@number不同,我没有取消restand。我更新了我的问题,不客气。但是我建议你回复你的更新,然后问一个新问题。因为如果其他人阅读了这个(更新的)问题,这个答案就不再符合这个问题了。你可以对你的新问题稍加评论。
io.mockk.MockKException: no answer found for: GetRecentPhotosUseCase(#1).invoke({per_page=20, method=flickr.photos.getRecent1, format=json, page=1, nojsoncallback=1}, continuation {})