簡體   English   中英

如何使用 ArgumentCaptor 進行存根?

[英]How to use ArgumentCaptor for stubbing?

在 Mockito 文檔javadocs 中,它說

建議將 ArgumentCaptor 與驗證一起使用,但不要與存根一起使用。

但我不明白 ArgumentCaptor 如何用於存根。 有人可以解釋上面的語句並展示 ArgumentCaptor 如何用於存根或提供一個鏈接來展示它是如何完成的嗎?

假設采用以下方法進行測試:

public boolean doSomething(SomeClass arg);

文檔的Mockito說,你應該以這種方式使用的捕手:

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);
assertThat(argumentCaptor.getValue(), equalTo(expected));

因為您可以在存根期間使用匹配器:

when(someObject.doSomething(eq(expected))).thenReturn(true);

但驗證是另一回事。 如果您的測試需要確保使用特定參數調用此方法,請使用ArgumentCaptor ,這是它設計的情況:

ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class);
verify(someObject).doSomething(argumentCaptor.capture());
assertThat(argumentCaptor.getValue(), equalTo(expected));

假設,如果搜索讓你找到這個問題,那么你可能想要這個:

doReturn(someReturn).when(someObject).doSomething(argThat(argument -> argument.getName().equals("Bob")));

為什么? 因為像我一樣,你很珍惜時間,你不會僅僅為了單一的測試場景而實現.equals

並且 99% 的測試會因 Mock 返回的 null 而失敗,在合理的設計中,您將不惜一切代價避免返回null ,使用Optional或轉向 Kotlin。 這意味着不需要經常使用verify並且 ArgumentCaptors 編寫起來太乏味了。

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);

會做同樣的事情

when(someObject.doSomething(Matchers.any())).thenReturn(true);

因此,當存根沒有附加值時使用argumentCaptor.capture()。 使用 Matchers.any() 可以更好地顯示真正發生的事情,因此可讀性更好。 使用argumentCaptor.capture(),您無法讀取真正匹配的參數。 而不是使用 any(),當您有更多信息(預期參數的類)時,您可以使用更具體的匹配器來改進您的測試。

還有一個問題:如果在存根時使用 argumentCaptor.capture() ,則不清楚在驗證后應該捕獲多少個值。 我們希望在驗證期間捕獲一個值,而不是在存根期間,因為此時還沒有要捕獲的值。 那么參數捕獲器捕獲方法在存根期間捕獲了什么? 它捕獲任何東西,因為還沒有什么可捕獲的。 我認為這是未定義的行為,我不想使用未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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