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