class MockitoTest extends MockitoSugar {
val serviceMock = mock[Service]
@Test
def test(): Unit = {
import org.mockito.Matchers.{eq => eqTo, _}
val serviceMock = mock[Service]
when( serviceMock.call("one") ).
thenReturn("123")
verify( serviceMock, times(1) ).call( eqTo("one") )
val result1 = serviceMock.call("one")
...
我最终拥有:
想要但未调用:service.call("one"); ->在莫比托。MockitoTest.test(MockitoTest.scala:34) 实际上,与这个模拟的交互为零。
我错过了什么吗?
您的测试应分为三个部分:
- 为协作者创建模拟,并使用
when
来描述他们的预期行为 - 调用与这些协作者交互的受测系统
- 如有必要,
verify
发生了一些交互。
在测试中,2 和 3 颠倒了,步骤 2 直接调用该方法,而不是让被测系统调用它。对verify
的调用失败,因为对serviceMock.call("one")
的调用尚未发生。
取而代之的是:
when( serviceMock.call("one") ).
thenReturn("123")
verify( serviceMock, times(1) ).call( eqTo("one") )
val result1 = serviceMock.call("one")
你想要这样的东西:
when( serviceMock.call("one") ).
thenReturn("123")
/** Instead of val result1 = serviceMock.call("one") directly: */
val systemUnderTest = SystemUnderTest(serviceMock)
systemUnderTest.someMethodThatInvokesServiceCall()
verify( serviceMock, times(1) ).call( eqTo("one") )
杰夫对调用的顺序是正确的。只是简化:
基本上"验证"应该是在调用之后:
@Test
def test(): Unit = {
// GIVEN
when( serviceMock. call("one") ).
thenReturn("123")
// WHEN
val result = serviceMock.call("one")
// THEN
verify( serviceMock, times(1) ).
call( eqTo("one") )
assert(result == "123")
}