簡體   English   中英

如何在測試期間通過Mockito驗證是否調用了SUT的另一種公共方法

[英]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(),但是我不能這樣做,因為經過測試的類不是模擬的。 我需要一種方法來驗證是否在真實對象上調用了該方法,而不僅僅是一個模擬。

您可以使用@SpyMockito.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM