Fuad Fadhil Azzar
Fuad Fadhil Azzar

Reputation: 55

Android Kotlin Testing: Wanted but not invoked, Actually, there were zero interactions with this mock

Just want to ask about my Unit.Testing error, so i have Unit.Testing like below and when i run this test i get error Wanted but not invoked: Actually, there were zero interactions with this mock. the point is i want to test that my requested data from the api is successfully displayed.

in the gradle, i already implement the

My UnitTesting is like this, i used mockito to do the test:

import com.google.gson.Gson
import com.panritech.fuad.footballmatchapp.TestContextProvider
import com.panritech.fuad.footballmatchapp.api.ApiRepository
import com.panritech.fuad.footballmatchapp.api.TheSportDBApi
import com.panritech.fuad.footballmatchapp.model.MatchItem
import com.panritech.fuad.footballmatchapp.model.MatchItemResponse
import com.panritech.fuad.footballmatchapp.view.MatchView
import org.junit.Test
import org.junit.Before
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations

class MatchPresenterTest {

    @Mock
    private lateinit var matchView: MatchView

    @Mock
    private lateinit var gson: Gson

    @Mock
    private lateinit var apiRepository: ApiRepository

    @Mock
    private lateinit var theSportDBApi: TheSportDBApi

    private lateinit var presenter: MatchPresenter

    @Before
    fun setUp(){
        MockitoAnnotations.initMocks(this)
        presenter = MatchPresenter(matchView,apiRepository, gson, TestContextProvider())
    }


    @Test
    fun testGetMatchList() {
        val match: MutableList<MatchItem> = mutableListOf()
        val response = MatchItemResponse(match)
        val league = "4328"

        `when`(gson.fromJson(apiRepository
                .doRequest(theSportDBApi.getMatch(league))
                ,MatchItemResponse::class.java)).thenReturn(response)

        presenter.getMatchList(league)

        verify(matchView).showMatchList(match)
    }
}

The Error Detail is Like Below:

Wanted but not invoked:
matchView.showMatchList([]);
-> at com.panritech.fuad.footballmatchapp.presenter.MatchPresenterTest.testGetMatchList(MatchPresenterTest.kt:52)
Actually, there were zero interactions with this mock.

Wanted but not invoked:
matchView.showMatchList([]);
-> at com.panritech.fuad.footballmatchapp.presenter.MatchPresenterTest.testGetMatchList(MatchPresenterTest.kt:52)
Actually, there were zero interactions with this mock.

    at com.panritech.fuad.footballmatchapp.presenter.MatchPresenterTest.testGetMatchList(MatchPresenterTest.kt:52)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)

Here is my Presenter

class MatchPresenter(private val matchView: MatchView,
                     private val apiRepository: ApiRepository,
                     private val gson: Gson,
                     private val context: CoroutineContextProvider = CoroutineContextProvider()) {
    fun getMatchList(league: String?) {

        async(context.main){
            val data = bg {
                gson.fromJson(apiRepository
                        .doRequest(TheSportDBApi.getMatch(league))
                        , MatchItemResponse::class.java
                )
            }
            matchView.showMatchList(data.await().events)
        }
    }
}

Upvotes: 4

Views: 1864

Answers (1)

Vishal Naikawadi
Vishal Naikawadi

Reputation: 493

In my case, I was able to execute tests independently but when I try to execute the entire file some of the tests fails. The solution added by OP in the comment worked for me. we have just had to put the verify function inside a launch

TestCoroutineScope().launch {
            verify(useCase, times(1)).getDetails()
        }

Upvotes: 6

Related Questions