[英]How to verify a method was called inside another method with Mockito
[英]How to verify with Mockito that another public method of SUT was called during test
我知道重復,但那里沒有給出關於實際問題的答案。
我有一堂課:
class A {
public long a() {
if(something) {
return quicklyCalculatedResult
} else {
return b() run on separate thread, with this one blocked
}
}
public long b() {} //doStuffOnCurrentThread;
}
我有一套完整的b()測試,可以完成繁重的工作。 不幸的是,我不得不像a()(舊版代碼)那樣丑陋地思考,並且我不想復制所有測試。 方法b()的。 而且,這兩個都需要公開。
我想驗證在某些情況下a()調用b(),但是我不能這樣做,因為經過測試的類不是模擬的。 我需要一種方法來驗證是否在真實對象上調用了該方法,而不僅僅是一個模擬。
您可以使用@Spy
或Mockito.spy()
使A
成為間諜。 這將允許您調用和測試a()
方法邏輯,但也可以用不變式替換b()
。 這可以用一個列表來說明:
List list = new LinkedList();
List spy = Mockito.spy(list);
// Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");
// You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
Mockito和其他kotlin模擬庫提供部分模擬或類似功能。 您可以指定要調用的實際方法,而其他方法仍然是存根:
Mockito Java示例:
A classUnderTest = mock(A.class);
when(classUnderTest.a()).thenCallRealMethod();
classUnderTest.a();
verify(classUnderTest).b()
有關部分模擬,請參閱模擬文檔 。 不鼓勵使用部分模擬,因為它不適合良好的OOP設計,但在您的情況下,它符合其預期的目的,即測試困難的舊代碼。
香草Mockito的Kotlin示例:
val classUnderTest = mock(A::class.java)
`when`(classUnderTest.a()).thenCallRealMethod()
classUnderTest.a()
verify(classUnderTest).b()
mockito-kotlin提供的擴展允許您以更常見的kotlin方式使用mockito。 不幸的是,似乎沒有一種以kotlin慣用的方式進行部分模擬的方法,但是可以在模仿者kotlin中實現,如下所示:
val classUnderTest = mock<A>()
doCallRealMethod().whenever(classUnderTest).a()
classUnderTest.a()
verify(classUnderTest).b()
MockK是一個慣用的kotlin模擬庫,允許間諜使用此功能。 創建該類的spy
之后,您可以選擇對方法進行存根:
val classUnderTest = spyk<A>()
every { classUnderTest.b() } returns 1L
classUnderTest.a()
verify { classUnderTest.b() }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.