Search code examples
kotlinjunitmockk

no answer found for: when wrapping answer with Success and Failure


Before using error management the test was working fine but once wrapping the response as bellow I start getting

no answer found for: PostPreviewRepository(#1).getPosts-qim9Vi0(0, continuation {})

Target method to test :

override suspend fun getPosts(page: UInt): Result<List<PostPreviewModel>> {
        return try {
            val posts = postService.getPosts(page)
            Success(postPreviewMapper.fromListDto(posts.body()!!.data))
        } catch (e : Exception) {
            Failure(HttpError(e))
        }
    }

Mapper

class PostPreviewMapper @Inject constructor(
    private val ownerPreviewMapper: OwnerPreviewMapper,
) {
    fun fromListDto(postPreviews: List<PostPreviewDTO>): List<PostPreviewModel> =
        postPreviews.map { fromDto(it) }

    fun fromDto(postPreview: PostPreviewDTO) = PostPreviewModel(
        id = postPreview.id,
        text = postPreview.text,
        imageUrl = postPreview.image,
        publishDate = postPreview.publishDate,
        owner = ownerPreviewMapper.fromDto(postPreview.owner)
    )
}

Unit test

@Test
    fun `Given repository returns empty list, When GetPostPreviewsUseCase is invoked, Then returns empty list`() =
        runTest {
            // Given
            coEvery { postPreviewRepository.getPosts(23u) } returns Success(emptyList())

            // When
            val postsList = getPostPreviewsUseCase.invoke()

            // Then
            postsList.onSuccess { postsModels ->
                assertTrue(postsModels.isEmpty())
            }
        }

Solution

  • This work for me :

       @Test
        fun `Given repository returns empty list, When GetPostUseCase is invoked, Then returns empty list`() =
            runTest {
                // Given
                coEvery { postRepository.getPosts(0) } returns ResultOf.Success(emptyList())
    
                // When
                val postsList = getPostUseCase.invoke(0) as ResultOf.Success
    
                // Then
                assertTrue(postsList.value.isEmpty())
            }