'unit test coroutine nullpointerexception when mocking

I am unit testing the following class

class LoadTrendingSearchUseCaseImp @Inject constructor(
    private val searchCriteriaProvider: SearchCriteriaProvider,
    private val coroutineDispatcherProvider: CoroutineDispatcherProvider
) : LoadTrendingSearchUseCase {

    override suspend fun execute(): List<String> {
        return withContext(coroutineDispatcherProvider.io()) {
            searchCriteriaProvider.provideTrendingSearch().trendingSearches
        }
    }
}

interface SearchCriteriaProvider {
    suspend fun provideTrendingSearch(): CatalogSearchPage
}

class SearchCriteriaProviderImp() : SearchCritieraProvider {
    override suspend fun provideTrendingSearch(): CatalogSearchPage {
        return withContext(coroutineDispatcherProvider.io()) {
           /* long running task */
        }
    }
}

interface CoroutineDispatcherProvider {
    fun io(): CoroutineDispatcher = Dispatchers.IO

    fun default(): CoroutineDispatcher = Dispatchers.Default

    fun main(): CoroutineDispatcher = Dispatchers.Main

    fun immediate(): CoroutineDispatcher = Dispatchers.Main.immediate

    fun unconfined(): CoroutineDispatcher = Dispatchers.Unconfined
}

class CoroutineDispatcherProviderImp @Inject constructor() : CoroutineDispatcherProvider

This is my actual test:

class LoadTrendingSearchUseCaseImpTest {
    private val searchCriteriaProvider: SearchCriteriaProvider = mock()
    private val coroutineDispatcherProvider = CoroutineDispatcherProviderImp()
    private lateinit var loadTrendingSearchUseCaseImp: LoadTrendingSearchUseCaseImp

    @Before
    fun setUp() {
        loadTrendingSearchUseCaseImp = LoadTrendingSearchUseCaseImp(
            searchCriteriaProvider,
            coroutineDispatcherProvider
        )
    }

    @Test
    fun `should provide trending searches`() {
        runBlockingTest {
            // Arrange
            // EXCEPTION HERE                whenever(searchCriteriaProvider.provideTrendingSearch().trendingSearches).thenReturn(
                emptyList()
            )

            // Act
            val actualResult = loadTrendingSearchUseCaseImp.execute()

            // Assert
            assertThat(actualResult).isEmpty()
        }
    }
}

The actual error message:

  java.lang.NullPointerException
    .product_search.usecase.imp.LoadTrendingSearchUseCaseImpTest$should provide trending searches$1.invokeSuspend(LoadTrendingSearchUseCaseImpTest.kt:30)


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source