Skip to content

Snappy1

  • Home
  • Android
  • What
  • How
  • Is
  • Can
  • Does
  • Do
  • Why
  • Are
  • Who
  • Toggle search form

[FIXED] unit testing – Android Studio Coroutine Tests Passing individually, failing when run together

Posted on November 11, 2022 By

Solution 1 :

It depends what is in your TestCoroutineRule class, but one thing you should definitely do is inject a TestDispatcher into your presenter, in place of both Dispatchers.Main and Dispatchers.IO.

Problem :

I know this has been asked a number of different ways with a number of different answers but none I can see help my situation. I am trying to test a presenter using coroutines. In order to verify behaviour I have implemented com.nhaarman.mockitokotlin2.mock. All tests pass individually but when run together they fail randomly (2 pass, 1 pass, 3 pass etc.)

I don’t have that much experience with coroutines so I’m hoping someone with a bit more experience could steer me here. Below is my test class. I can add more info if required

package com.project.ui.search.results

import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.never
import com.nhaarman.mockitokotlin2.whenever
import ie.distilledsch.dschapi.models.search.SavedSearchCreateResponse
import io.reactivex.schedulers.TestScheduler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.runBlocking
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentMatchers
import org.mockito.Mock
import org.mockito.Mockito.doThrow
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import retrofit2.HttpException

@ExperimentalCoroutinesApi
class SPSearchResultsPresenterSavedSearchesTest {

    @get:Rule val testCoroutineRule = TestCoroutineRule()
    private lateinit var interactor: SPSearchResultsInteractor
    @Mock private lateinit var view: SPSearchResultsView
    @Mock private lateinit var context: Context
    @Mock private lateinit var interactorBtwAdListAndAdDetails: InteractorBetweenListOfAdsAndAdDetails
    @Mock private lateinit var daftLoginManager: DaftLoginManager
    private lateinit var searchForm: SearchForm
    private lateinit var searchManager: SearchManager
    private lateinit var testScheduler: TestScheduler
    lateinit var presenter: SPSearchResultsPresenter

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
        interactor = mock()
        testScheduler = TestScheduler()
        searchForm = SearchForm()
        searchManager = SearchManager(searchForm)
        val presenterToTest = SPSearchResultsPresenterImpl(testScheduler, testScheduler,
                testScheduler, Dispatchers.Main, Dispatchers.IO, interactorBtwAdListAndAdDetails, daftLoginManager, context, view)
        presenterToTest.interactor = interactor
        presenterToTest.searchManager = searchManager
        presenter = presenterToTest
    }

    @Test
    fun `save search dialog confirm click success`() = runBlocking {
        val savedSearchTitle = "title"
        val savedSearchID = 1234
        val responseModel = SavedSearchCreateResponse(201, "Created", savedSearchID)
        whenever(interactor.saveNewSearch(savedSearchTitle)).thenReturn(responseModel)

        presenter.onSaveSearchDialogOkClick(savedSearchTitle)
        verify(interactor).saveNewSearch(savedSearchTitle)
        verify(view).displayIconForSavedSearch()
    }

    @Test
    fun `save search dialog confirm click failure`() = runBlocking {
        val savedSearchTitle = "title"
        val exception :HttpException = mock()

        doThrow(exception).`when`(interactor).saveNewSearch(savedSearchTitle)
        presenter.onSaveSearchDialogOkClick(savedSearchTitle)
        verify(interactor).saveNewSearch(savedSearchTitle)
        verify(view, never()).displayIconForSavedSearch()
        verify(view).showFetchSavedSearchFailedToast()
    }

    @Test
    fun `delete search success logged in`() = runBlocking {
        val savedSearchID = 1234
        whenever(interactor.isUserLoggedIn()).thenReturn(true)
        searchManager.isSearchSaved = true
        searchManager.savedSearchId = savedSearchID
        presenter.onSaveMenuItemClick()
        verify(interactor).deleteSavedSearch(savedSearchID)
        verify(view).displayIconForUnsavedSearch()
    }

    @Test
    fun `delete search error logged in`() = runBlocking {
        val savedSearchID = 1234
        val exception :HttpException = mock()
        whenever(interactor.isUserLoggedIn()).thenReturn(true)
        searchManager.isSearchSaved = true
        searchManager.savedSearchId = savedSearchID
        whenever(interactor.deleteSavedSearch(savedSearchID)).thenThrow(exception)
        presenter.onSaveMenuItemClick()
        verify(interactor).deleteSavedSearch(savedSearchID)
        verify(view, never()).displayIconForUnsavedSearch()
        verify(view).showSnackBar(ArgumentMatchers.anyInt())
    }

    @Test
    fun `click on save search not logged in` () = runBlocking {
        whenever(interactor.isUserLoggedIn()).thenReturn(false)
        presenter.onSaveMenuItemClick()
        verify(view).showLoginScreen()
    }
}

Comments

Comment posted by ibrahimyilmaz

TestCorotuneRule

READ  [FIXED] android - How to convert/revert ParseObject to Json
Powered by Inline Related Posts
Android Tags:android, android-mvp, kotlin-coroutines, unit-testing

Post navigation

Previous Post: [FIXED] Android Studios error : Unable to locate adb location
Next Post: [FIXED] android – Here Maps Navigation samples seem to be missing the Navigation Library

Related Posts

[FIXED] java – Retrive Child values Failed-Firebase- Android Android
[FIXED] android – Change font in whole application programmatically, based in user selection Android
[FIXED] android – Paytm “networkError” Android
[FIXED] java – Is initializing a new RecyclerView Adapter an asynchronous call? Android
[FIXED] What is right place to start a WorkManager in MVVM architecture Android? Android
[FIXED] android – Start a FlutterActivity subclass using a cached engine Android

Archives

  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022

Categories

  • ¿Cómo
  • ¿Cuál
  • ¿Cuándo
  • ¿Cuántas
  • ¿Cuánto
  • ¿Qué
  • Android
  • Are
  • At
  • C'est
  • Can
  • Comment
  • Did
  • Do
  • Does
  • Est-ce
  • Est-il
  • For
  • Has
  • Hat
  • How
  • In
  • Is
  • Ist
  • Kann
  • Où
  • Pourquoi
  • Quand
  • Quel
  • Quelle
  • Quelles
  • Quels
  • Qui
  • Should
  • Sind
  • Sollte
  • Uncategorized
  • Wann
  • Warum
  • Was
  • Welche
  • Welchen
  • Welcher
  • Welches
  • Were
  • What
  • What's
  • When
  • Where
  • Which
  • Who
  • Who's
  • Why
  • Wie
  • Will
  • Wird
  • Wo
  • Woher
  • you can create a selvedge edge: You can make the edges of garter stitch more smooth by slipping the first stitch of every row.2022-02-04
  • you really only need to know two patterns: garter stitch

Recent Posts

  • Can Vicks humidifier be used without filter?
  • What color is Spanish green?
  • How old is Jamie in The War That Saved My Life?
  • When should I use scalp massager for hair growth?
  • Can I put polyurethane over liming wax?

Recent Comments

No comments to show.

Copyright © 2023 Snappy1.

Powered by PressBook Grid Dark theme