[英]Java Arguments.of() in a test case: How does it work?
我得到了參數化的測試用例,並使用我不熟悉的 Stream.of 和 Arguments.of。 如下所示,測試用例引用了我的 class BofAAdapter 的構造函數並傳遞了 BofA object。我想知道如何在我的 class 中訪問 integer (500) 和 map 條目,或者它們被傳遞到哪里。 我不能編輯測試用例,所以我不能簡單地讓它們用不同的構造函數進行測試。 我對這個測試所做的很迷茫。
@ParameterizedTest
@MethodSource("providerBankAccountsGetDelinquent")
public void testBankAccountsGetDelinquent(IBankAccounts adapter, int threshold, Map<Integer, Integer> expected) {
Map<Integer, Integer> actual = adapter.getDelinquent( threshold );
assertEqualMaps( expected, actual );
}
static Stream<Arguments> providerBankAccountsGetDelinquent() {
return Stream.of(
Arguments.of( new BofAAdapter( new BofA() ), 500,
Map.ofEntries(
Map.entry( 1, 500),
Map.entry( 5, 20)
)),
您可以在上面鏈接的 junit 網站上了解 Arguments 的內容和使用方法,以及這里發生的事情。
給你一個快速概覽:通常,測試方法沒有 arguments。測試框架 (junit5) 將看到@Test
注釋並運行它。
但這是一個不同的野獸:這個測試方法有..參數:試一下測試框架? 你將如何調用它? 您將什么傳遞給“適配器”和“閾值”?
這就是@MethodSource
注釋的含義:它告訴 junit:首先,運行providerBankAccountsGetDelinquent
方法,junit 可以執行該方法,因為沒有 arguments 要傳遞。 然后獲取此方法為您提供的 arguments,它是一個 stream(因此, Arguments
類的任意數量的實例),並針對每個 Arguments object 運行此測試方法一次。
所以,這最終發生了:
Stream<Arguments>
object。testBankAccountsGetDelinquent
並根據該測試的結果打印“成功”或“失敗”(這將取決於這些映射是否相等)換句話說,所有這些代碼都是一種復雜而愚蠢的編寫方式:
@Test
public void testBankAccountsGetDelinquent() {
IBankAccounts adapter = new BofAAdapter( new BofA() );
int threshold = 500;
Map<Integer, Integer> expected = Map.ofEntries(
Map.entry( 1, 500),
Map.entry( 5, 20)
);
Map<Integer, Integer> actual = adapter.getDelinquent( threshold );
assertEqualMaps(expected, actual);
}
當然,大概這段代碼是向您展示@ParameterizedTest
工作原理的示例,或者有人計划擴展providerBankAccountsGetDelinquent
。
請注意,一般的想法是您使用此@ParameterizedTest
機制來創建動態輸入。 想象一下,例如,您想要對從 400 到 500 的所有閾值運行此測試,並且 map 也發生變化。 那么這是做到這一點的一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.