改造的单元测试

时间:2019-06-26 14:12:05

标签: android unit-testing retrofit2

由于Retrofit 2.6.0支持Coroutines,并且不赞成使用kotlinCoroutinesAdapter库,因此我开始重构API调用。我更改了它,并且工作正常,但是单元测试有问题。

这是我的通话方式:

//Retrofit API
@GET("playlists/{playlistId}")
    fun getPlaylistAsync(@Path("playlistId") id: String): Deferred<PlaylistData>

//DataSource
fun getPlaylistAsync(playlistId: String): Deferred<PlaylistData> = playlistApi.getPlaylistAsync(playlistId)

//Repository
override suspend fun getPlaylist(playlistId: String): PlaylistDomain {
        val playlistDeferred = remoteDataSource.getPlaylistAsync(playlistId)
        return playlistRemoteMapper.map(playlistDeferred.await())
    }

这就是我为了使其工作而进行的更改:

//Retrofit API
@GET("playlists/{playlistId}")
    fun getPlaylistAsync(@Path("playlistId") id: String): Call<PlaylistData>

//DataSource
fun getPlaylistAsync(playlistId: String): Call<PlaylistData> = playlistApi.getPlaylistAsync(playlistId)

//Repository
override suspend fun getPlaylist(playlistId: String): PlaylistDomain {
        val playlistDeferred = remoteDataSource.getPlaylistAsync(playlistId)
        return playlistRemoteMapper.map(playlistDeferred.await())
    }

基本上是一样的...与Deferred和Call一起使用的await()有所不同,但是其他所有内容都如此。

正如我所说的,问题来自于测试。这是我对第一个示例所做的操作:

@Test
fun `getPlaylist() maps correctly the playlist and the favorite request when is favorite`() = runBlocking {
    val playlist = PlaylistDataBuilder().getPlaylistData(id = PLAYLIST_ID)

    every { playlistDataSource.getPlaylistAsync(PLAYLIST_ID) } answers { async { playlist } }

    val response = playlistRepository.getPlaylist(PLAYLIST_ID)

    assertTrue(response.isFavorite)
}

现在,我想更改它以适合第二个示例...但是async返回Deferred,现在我需要Call来满足我的需求。我尝试模拟Call并执行以下操作:

@Test
fun `getPlaylist() maps correctly the playlist and the favorite request when is favorite`() = runBlocking {
    val playlist = PlaylistDataBuilder().getPlaylistData(id = PLAYLIST_ID)
    every { playlistCall.await() }

    every { playlistDataSource.getPlaylistAsync(PLAYLIST_ID) } answers { playlistCall }

    val response = playlistRepository.getPlaylist(PLAYLIST_ID)

    assertTrue(response.isFavorite)
}

这里的问题是playlistCall.await()必须放入suspend方法中,这样我才能使它无法以这种方式工作。我需要一种方法来对改装电话进行单元测试。

0 个答案:

没有答案
相关问题