Android Mockito TooManyActualInvocations

时间:2018-11-29 06:46:10

标签: android junit kotlin mockito

我正在使用Mockito编写测试代码。 我遇到了TooManyActualInvocations错误。

org.mockito.exceptions.verification.TooManyActualInvocations: 
mockView.enableProgressBar(0);
Wanted 1 time:
-> at com.MyPresenterTest.doSomething(MyPresenterTest.kt:160)
But was 2 times. Undesired invocation:
-> at com.MyPresenter.doSomething(MyPresenter.kt:195)

这是我的示例代码:

class MyPresenter(val view: MyView) {

    fun doSomething() {
        view.enableProgressBar(0)
        view.enableProgressBar(1)
        view.enableProgressBar(2)
        view.enableProgressBar(0)
    }

}

这是我的测试代码:

@Test
fun doSomethingTest() {
    myPresenter.doSomething()

    Mockito.verify(mockView).enableProgressBar(0)
    Mockito.verify(mockView).enableProgressBar(1)
    Mockito.verify(mockView).enableProgressBar(2)
    Mockito.verify(mockView).enableProgressBar(0)
}

如果我删除此行或将值从“ 0”更改为其他值,则该值不会重复。

我该如何解决?

2 个答案:

答案 0 :(得分:3)

TooManyActualInvocations意味着...实际调用过多。

必须正常工作

@Test
fun doSomethingTest() {
    myPresenter.doSomething()
    Mockito.verify(mockView, times(2)).enableProgressBar(0)
    Mockito.verify(mockView).enableProgressBar(1)
    Mockito.verify(mockView).enableProgressBar(2)
}

由于enableProgressBar被称为两次,且参数为0 ,因此该断言应该是适当的(应该断言它被两次调用)。 或者,如果您想为实现细节留一些空间,可以使用一些方便的Mockito方法,例如atLeastOnce()atMost(2)等,而不是简单的times

答案 1 :(得分:0)

我找到了解决方法。

我不了解“ InOrder”界面。 下面的代码解决了我的问题。

@Test
fun doSomethingTest() {
    myPresenter.doSomething()

    val inOrder = Mockito.inOrder(mockView)

    inOrder.verify(mockView).enableProgressBar(0)
    inOrder.verify(mockView).enableProgressBar(1)
    inOrder.verify(mockView).enableProgressBar(2)
    inOrder.verify(mockView).enableProgressBar(0)
}