Модификация Mockito2 с архитектурой MVP - PullRequest
0 голосов
/ 06 сентября 2018

Я думаю, что-то не так с моим кодом в TeamImplsTest, и мне нужен совет: D Это мой код

API интерфейс

interface API { @GET("lookupteam.php") fun getTeam(@Query("id") id: String): Call<TeamModel> }

TeamPresenter

interface MatchPresenter { fun loadTeamDetail(team_id: String) }

TeamImpls

class TeamImpls(val teamView: TeamView) : TeamPresenter {

    override fun loadTeamDetail(team_id: String) {
        val call = RetrofitConfig().getApi().getTeam(team_id)
        call.enqueue(object : Callback {
            override fun onResponse(call: Call, response: Response) {
                if (response.isSuccessful()) {
                    val res = response.body()
                    res?.let { teamView.onSuccess(it) }
                }
            }

            override fun onFailure(call: Call, t: Throwable) {
                Log.e("PrevMatchFragment", t.toString())
            }
        })
    }
}

TeamModel

data class TeamModel(
        val teams: ArrayList
)

data class TeamModeLResult(
        val idTeam: String,
        val strTeam: String,
        val strAlternate: String,
        val strSport: String,
        val strStadium: String,
        val strTeamBadge: String
)

И

Это мой TeamImplsTest

class TeamImplsTest {

    @Mock
    private lateinit var teamView: TeamView

    @Mock
    private lateinit var teamPresenter: TeamPresenter

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)

        teamPresenter = TeamImpls(teamView)
    }

    @Test
    fun loadTeamDetail() {
        val teams = TeamModel(arrayListOf())

        val teamId = "133613"

        teamPresenter.loadTeamDetail(teamId)

        Mockito.verify(teamView).onSuccess(teams)
    }
}

я получил ошибку

Wanted but not invoked:
teamView.onSuccess(TeamModel(teams=[]));
-> at com.fathurradhy.matchschedule.domain.presenter.TeamImplsTest.loadTeamDetail(TeamImplsTest.kt:34)
Actually, there were zero interactions with this mock.

Wanted but not invoked:
teamView.onSuccess(TeamModel(teams=[]));
-> at com.fathurradhy.matchschedule.domain.presenter.TeamImplsTest.loadTeamDetail(TeamImplsTest.kt:34)
Actually, there were zero interactions with this mock.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы не издеваетесь над вызовом API, так как loadTeamDetail создает свой собственный экземпляр API.

Чтобы вы могли проверить поведение вызова API, вы можете предоставить экземпляр API через конструктор, например,

class TeamImpls(private val api: API, private val teamView: TeamView) : TeamPresenter {

    override fun loadTeamDetail(team_id: String) {
        val call = api.getTeam(team_id)

Это позволит вам смоделировать поведение API и убедиться, что докладчик вызывает правильный метод, когда вызов завершается неудачно / успешно, например,

class TeamImplsTest {

    @Mock
    private lateinit var teamView: TeamView

    @Mock
    private lateinit var api: API

    @Mock
    private lateinit var teamPresenter: TeamPresenter

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)

        teamPresenter = TeamImpls(api, teamView)
    }

    @Test
    fun loadTeamDetail() {
        val teams = TeamModel(arrayListOf())

        val teamId = "133613"

        // Use retrofit-mock to create your mockResponse.
        // See: https://github.com/square/retrofit/tree/master/retrofit-mock
        Mockito.`when`(api.getTeam(teamId)).thenReturn(Calls.response(teams)

        teamPresenter.loadTeamDetail(teamId)

        Mockito.verify(teamView).onSuccess(teams)
    }
}
...