我想通过模拟验证来验证是否至少调用一次方法。我使用了verify,它抱怨像这样:

org.mockito.exceptions.verification.TooManyActualInvocations: 
Wanted 1 time:
But was 2 times. Undesired invocation:


#1 楼

使用适当的VerificationMode:

 import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

verify(mockObject, atLeast(2)).someMethod("was called at least twice");
verify(mockObject, times(3)).someMethod("was called exactly three times");
 


评论


您也可以使用Mockito.times(...)代替VerificationModeFactory.times(...)进行静态导入

– Wim Deblauwe
15年11月24日在10:16

导入静态org.mockito.Mockito.times;。通常不建议导入其中带有“内部”的包(导入静态org.mockito.internal.verification.VerificationModeFactory.times;)。

–罗杰
16年5月31日在20:52



还有另一种书写times(1)的方式吗?

– Glenn Bech
17年8月10日在10:57

@GlennBech您可以忽略它,它是隐式的。默认的verify(mockObject).someMethod(“”)查找精确的1个交互(不多也不少)。相反,如果您希望至少一次调用该方法,则可以使用atLeastOnce()说明符。

– nbrooks
17年8月10日在21:23



@Roger我同意你的观点,对于像我这样的TDD初学者来说,静态导入使我更加难以记住方法或所使用的框架(Mockito,Espresso或只是普通的单元测试)。

–只需两次思考代码
17年10月4日在1:58

#2 楼

构建gradle:
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"

代码:
interface MyCallback {
  fun someMethod(value: String)
}

class MyTestableManager(private val callback: MyCallback){
  fun perform(){
    callback.someMethod("first")
    callback.someMethod("second")
    callback.someMethod("third")
  }
}

测试:
import com.nhaarman.mockitokotlin2.times
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.mock
...
val callback: MyCallback = mock()
val manager = MyTestableManager(callback)
manager.perform()

val captor: KArgumentCaptor<String> = com.nhaarman.mockitokotlin2.argumentCaptor<String>()

verify(callback, times(3)).someMethod(captor.capture())

assertTrue(captor.allValues[0] == "first")
assertTrue(captor.allValues[1] == "second")
assertTrue(captor.allValues[2] == "third")