首页 文章

Mockito改造2与MVP架构

提问于
浏览
0

我认为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 回答

  • 2

    您没有嘲笑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)
        }
    }
    

相关问题