团队成员
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 )
而且
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.
因为loadTeamDetail创建了自己的API实例,所以您不是在嘲笑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)
}
}
本文向大家介绍浅谈Android官方MVP架构解读,包括了浅谈Android官方MVP架构解读的使用技巧和注意事项,需要的朋友参考一下 综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的。而对于Android应用的开发中本身可视为一种MVC架构。通常在开发中将XML文件视为MVC中的View角色,而将Act
查看https://github.com/googlesamples/android-architecture/blob/todo-mvp-dagger/todoapp/app/src/main/java/com/example/android/architecture/blueprents/todoapp/tasksfragment.java: 和https://github.com/googl
模型-视图-展示器(MVP)是MVC设计模式的一个衍生模式,它专注于提升展现逻辑.它来自于上个世纪九十年代早期的一个叫做Taligent的公司,当时他们正工作于一个基于C++ CommonPoint环境的模型.而MVC和MVP的目标都直指对整个多组件关注点的分离,它们之间有一些基础上的不同。 为了要做出总结的目的,我们将专注于最适合于基于Web架构的MVP版本。 模型,视图&展示器 MVP中的P代
前面我们对基于 MINA 的服务端架构有了一个大体认识,现在我们看一下客户端的情况。客户端需要连接到一个服务端,发送消息并处理响应 客户端首先创建一个 IOConnector (用以连接 Socket 的 MINA Construct (构件)),开启一个服务器的绑定 在连接创建时,一个 Session 会被创建并关联到该连接 应用或者客户端写入 Session,导致数据在穿越 Filter Ch
前面我们披露了基于 MINA 的应用架构。现在我们来关注一下服务器端架构。从根本上说,服务器端监听一个端口以获得连入的请求,将其进行处理然后发送回复。服务器端还会为每个客户端 (无论是基于 TCP 还是基于 UDP 协议的) 创建并维护一个 session,详见Chapter 4 - Session。 I/O Acceptor 监听网络以获取连入的连接或者包 对于一个新的连接,一个新的 sessi
为什么要有Ansbile Tower Ansilbe Tower一款针对企业级的收费软件。 在上一节的Ansible架构中和下一章Ansbile的安装中会讲到,每一台被ansible远程管理的主机,都需要配置基于key的ssh连接。个人用户自己管理几台虚拟机和远程主机不会有什么问题,但是作为企业级也用户,则满足不了业务和安全上的需求。 首先,每增加一台主机,都需要手工配置一下ssh连接,企业级的p