【问题标题】:Mockito testing in MVP kotlin - However, there was exactly 1 interaction with this mock exceptionMVP kotlin 中的 Mockito 测试 - 但是,与此模拟异常只有 1 次交互
【发布时间】:2019-09-26 10:23:41
【问题描述】:

我已经使用 Kotlin 和 MVP 架构开发了一个应用程序。我想使用 Mockito 进行单元测试,但无法实现。我得到“但是,这个模拟异常只有 1 次交互”。 在我的应用程序中,我使用了 5 个不同的类。

  1. 视图 - 界面
  2. Intractor - 界面
  3. IntractorImpl - 类
  4. 演示者 - 界面
  5. PresenterImpl - 类

View:-它包含了通信活动/片段所需的所有方法。

Intractor:-它包含结果接口方法。

IntractorImpl :- 它包含数据库/服务器逻辑,它将从 Intractor 实现

Presenter :- 它包含访问 IntractorImpl 类的方法

PresenterImpl :- 它由 Presenter 和 Intractor 结果方法实现

我遵循这个架构来实现,现在要实现 Mockito,我感到很困惑,根据我在谷歌找到的文章,如果我尝试实现,我会得到 “但是,只有 1 次交互有这个模拟异常”

对于 mockito,我使用了以下导入

 //Mockito
testImplementation "org.mockito:mockito-core:2.24.5"
testImplementation "org.mockito:mockito-inline:2.24.5"

如果有人知道,请帮助我。我第一次使用 Mokito。 如果有人需要更多信息,我可以发布它。以下是我的代码

class EventTest {
    @Mock
    val homeActivity = HomeActivity()
    lateinit var eventView: HomeView
    lateinit var eventInteractorImpl: HomeInteractorImpl
    lateinit var eventPresenter: HomePresenter
    lateinit var eventInteractor: HomeInteractor.OnEventsReceivedListener
    @Before
    fun setUpEventPresenter() {
        eventView = mock(HomeView::class.java)
        eventInteractorImpl = mock(HomeInteractorImpl::class.java)
        eventPresenter = HomePresenterImpl(eventView, eventInteractorImpl)
        eventInteractor = mock(HomeInteractor.OnEventsReceivedListener::class.java)
    }

    @Test
    fun startEventTest() {
        val testEvents = Event(
            "1",
            "Test",
            "Next week we have the vacation planing in Vizag",
            "This is for test",
            "1",
            "01-10-2019",
            "26-09-2019",
            "8.00",
            "10.47",
            "",
            true
        )
        val events: ArrayList<Event> = ArrayList<Event>()
        events.add(testEvents)
        eventPresenter.getEventsList(homeActivity)
        verify(eventView).showProgress()
        verify(eventView).showEvents(events)
        verify(eventView).hideProgress()
    }

}

如果我输入verify(eventView).showProgress(),则不会出现异常。

 override fun getEventsList(context: Context) {
    homeView.showProgress()
    homeInteractor.getEvents(context, this)
}

在 getEvents() 方法中,我们调用服务器/本地数据库,对于服务器,我们使用 Retrofit。

【问题讨论】:

  • 能否添加getEventsList函数的代码?
  • @NatigBabayev 在 getEventsList 函数中我正在调用 Intractor 方法以从服务器/本地数据库获取数据
  • @NatigBabayev 我的应用程序 MVP 几乎类似于这个medium.com/@MiBLT/refactoring-to-mvp-b504a3774ffd
  • 如果不发布getEventsList(),我认为我们无法就测试失败的原因提供任何帮助。另外,我已经通过了免费文章限制,所以,我无法检查那个帖子:D 你可以在这里发布代码。
  • @我已经更新了代码,请检查一次。

标签: android kotlin mockito


【解决方案1】:

根据您在 cmets 中提供的代码和解释,您收到的错误消息是正确的,因为您正在调用无法调用其他视图函数的模拟 interactor

因此,您应该在startEventTest() 中验证的唯一内容是verify(eventView).showProgress()verify(eventInteractorImpl).getEvents(any(), any())

@Test
fun startEventTest() {
    val testEvents = Event(
        "1",
        "Test",
        "Next week we have the vacation planing in Vizag",
        "This is for test",
        "1",
        "01-10-2019",
        "26-09-2019",
        "8.00",
        "10.47",
        "",
        true
    )
    val events: ArrayList<Event> = ArrayList<Event>()
    events.add(testEvents)
    eventPresenter.getEventsList(homeActivity)
    verify(eventView).showProgress()
    verify(eventInteractorImpl).getEvents(any(), any())
}

如果您仍想测试verify(eventView).showEvents(events)verify(eventView).hideProgress(),而不是模拟交互器,您应该创建它的实例。

【讨论】:

  • 我试过这个仍然无法做到“任何()不能为空”异常来了
  • 你可以使用 mockito kotlin 那么你不应该得到这样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2011-12-18
相关资源
最近更新 更多