具有 MVP 架构的 Mockito retrofit2
Mockito retrofit2 with MVP architecture
我认为我在 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())
}
})
}
}
团队模型
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.
您不是在嘲笑 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 行为并验证演示者在调用 fails/succeeds 时调用正确的方法,例如
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)
}
}
我认为我在 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()) } }) } }
团队模型
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.
您不是在嘲笑 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 行为并验证演示者在调用 fails/succeeds 时调用正确的方法,例如
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)
}
}